초안 ECMA-262 / 2025년 8월 17일
ECMAScript® 2026 언어 명세서
소개
이 Ecma 표준은 ECMAScript 2026 언어를 정의합니다. 이것은 ECMAScript 언어 명세의 열일곱 번째 에디션입니다. 1997년 첫 번째 에디션이 출판된 이후,
ECMAScript는 세계에서 가장 널리 사용되는 범용 프로그래밍 언어 중 하나로 성장했습니다. 주로 웹 브라우저에 내장된 언어로 잘 알려져 있지만, 서버 및 임베디드 애플리케이션에서도
널리 채택되었습니다.
ECMAScript는 여러 원천 기술을 기반으로 하며, 그 중 가장 잘 알려진 것은 JavaScript(넷스케이프)와 JScript(마이크로소프트)입니다. 이 언어는 넷스케이프의
Brendan Eich가 발명했으며, 처음으로 그 회사의 Navigator 2.0 브라우저에 등장했습니다. 이후 넷스케이프의 모든 브라우저와 마이크로소프트의 Internet
Explorer 3.0부터 모든 브라우저에 포함되었습니다.
ECMAScript 언어 명세의 개발은 1996년 11월에 시작되었습니다. 이 Ecma 표준의 첫 번째 에디션은 1997년 6월 Ecma 총회에서 채택되었습니다.
그 Ecma 표준은 ISO/IEC JTC 1에 신속 채택 절차 하에 제출되었으며, 1998년 4월 국제 표준 ISO/IEC 16262로 승인되었습니다. 1998년 6월 Ecma 총회에서
ISO/IEC 16262와 완전히 일치시키기 위해 ECMA-262 두 번째 에디션이 승인되었습니다. 첫 번째와 두 번째 에디션의 차이점은 편집상의 변경입니다.
표준의 세 번째 에디션에서는 강력한 정규식, 향상된 문자열 처리, 새로운 제어문, try/catch 예외 처리, 오류 정의 강화, 숫자 출력 포맷 및 향후 언어 성장에 대비한 사소한 변경이
도입되었습니다. ECMAScript 표준의 세 번째 에디션은 1999년 12월 Ecma 총회에서 채택되었으며, 2002년 6월 ISO/IEC 16262:2002로 출판되었습니다.
세 번째 에디션 출판 이후, ECMAScript는 월드와이드웹과 함께 엄청난 채택을 이루었으며, 사실상 모든 웹 브라우저에서 지원되는 프로그래밍 언어가 되었습니다. ECMAScript의 네
번째 에디션을 개발하기 위한 중요한 작업이 이루어졌으나, 그 작업은 완성되지 않았고 네 번째 에디션으로 출판되지 않았습니다. 다만 일부 내용은 여섯 번째 에디션 개발에 통합되었습니다.
ECMAScript의 다섯 번째 에디션(ECMA-262 5번째 에디션으로 출판됨)은 브라우저 구현에서 일반적으로 사용되는 언어 명세의 사실상 해석을 공식화하였고, 세
번째 에디션 출판 이후 등장한 새로운 기능 지원을 추가했습니다. 이러한 기능에는 접근자 속성 , 객체의 반영적 생성 및 검사, 속성 특성의 프로그램 제어, 추가 배열 조작 함수,
JSON 객체 인코딩 포맷 지원, 그리고 향상된 오류 검사와 프로그램 보안을 제공하는 엄격 모드가 포함됩니다. 다섯 번째 에디션은 2009년 12월 Ecma 총회에서 채택되었습니다.
다섯 번째 에디션은 신속 채택 절차에 따라 ISO/IEC JTC 1에 제출되어 국제 표준 ISO/IEC 16262:2011로 승인되었습니다. ECMAScript 표준의 5.1 에디션은
사소한 수정이 반영되었으며 ISO/IEC 16262:2011과 동일한 텍스트입니다. 5.1 에디션은 2011년 6월 Ecma 총회에서 채택되었습니다.
여섯 번째 에디션의 집중 개발은 2009년에 시작되었으며, 다섯 번째 에디션이 출판 준비 중이었습니다. 하지만 그 이전에도 1999년 세 번째 에디션 출판 이후 상당한 실험과 언어 개선
디자인 작업이 이루어졌습니다. 실제로 여섯 번째 에디션의 완성은 15년간의 노력의 결실입니다. 이 에디션의 목표는 대규모 애플리케이션, 라이브러리 제작, 그리고 ECMAScript를 다른
언어의 컴파일 타겟으로 사용하는 데 더 나은 지원을 제공하는 것이었습니다. 주요 개선사항에는 모듈, 클래스 선언, 렉시컬 블록 스코프, 이터레이터 와 제너레이터, 비동기 프로그래밍을 위한 프라미스, 구조 분해 패턴, 적절한 꼬리
호출이 포함되었습니다. ECMAScript 내장 라이브러리는 맵, 셋, 2진 숫자 값 배열 등의 추가 데이터 추상화 지원과 문자열 및 정규식에서 유니코드 보충 문자 추가 지원을 포함하여
더욱 확장되었습니다. 내장 객체는 서브클래싱을 통해 확장 가능해졌습니다. 여섯 번째 에디션은 정기적이고 점진적인 언어 및 라이브러리 개선의 토대를 제공합니다. 여섯 번째 에디션은
2015년 6월 총회에서 채택되었습니다.
ECMAScript 2016은 Ecma TC39의 새로운 연간 릴리즈 주기와 공개 개발 프로세스 하에서 릴리즈된 첫 번째 ECMAScript 에디션입니다. 텍스트 소스 문서는
ECMAScript 2015 소스에서 제작되어 GitHub에서 추가 개발의 기반이 되었습니다. 표준 개발 기간 동안 수백 개의 풀 리퀘스트와 이슈가 제출되어 수천 건의 버그 수정, 편집
개선 및 기타 향상 작업이 이루어졌습니다. 또한 Ecmarkup, Ecmarkdown, Grammarkdown 등 여러 소프트웨어 도구가 개발되었습니다. ES2016에는 새로운 거듭제곱
연산자와 Array.prototype에 includes 메서드가 추가되었습니다.
ECMAScript 2017은 Async 함수, 공유 메모리, Atomics, 그리고 더 작은 언어 및 라이브러리 개선, 버그 수정, 편집 업데이트를 도입했습니다. Async 함수는
프라미스를 반환하는 함수에 대한 문법을 제공하여 비동기 프로그래밍 경험을 향상시킵니다. 공유 메모리와 Atomics는 병렬 CPU에서도 명확한 실행 순서를 보장하는 원자적 연산을 사용하여
다중 에이전트 프로그램이 통신할 수 있는 새로운
메모리 모델 을
도입했습니다. 또한 객체에 대한 새로운 정적 메서드인 Object.values, Object.entries,
Object.getOwnPropertyDescriptors도 포함되었습니다.
ECMAScript 2018은 비동기 이터레이터 프로토콜과 async 제너레이터를 통해 비동기 반복 지원을
도입했습니다. 또한 네 가지 새로운 정규식 기능(dotAll 플래그, 명명된 캡처 그룹, 유니코드 속성 이스케이프, 그리고 look-behind 어설션)과 객체의 rest 및 spread
속성을 추가했습니다.
ECMAScript 2019는 Array.prototype의 flat 및 flatMap 함수를 통한 배열 평탄화,
Object.entries의 반환값을 새 객체로 바로 변환하는 Object.fromEntries, 더 나은 이름의
String.prototype.trimStart 및 trimEnd 내장 함수(기존 비표준 trimLeft,
trimRight 대체용) 등 몇 가지 새로운 내장 함수를 도입했습니다. 또한 문법 및 의미론에 대한 소규모 업데이트(선택적 catch 바인딩 파라미터, JSON과
일치시키기 위해 문자열 리터럴에서 U+2028 및 U+2029 허용 등)가 포함되었습니다. 기타 업데이트에는 Array.prototype.sort의 안정적 정렬
요구, JSON.stringify의 입력에 상관없이 올바른 UTF-8 반환 요구, Function.prototype.toString의
명확화(원본 소스 텍스트 또는 표준 플레이스홀더 반환 요구)가 있습니다.
ECMAScript 2020, 11번째 에디션은 문자열의 matchAll 메서드(글로벌 정규식으로 생성된 모든 매치 객체에 대한 이터레이터
생성), import() 문법(동적 지정자로 모듈을 비동기적으로 import), BigInt(임의 정밀도의 정수 를 다루는 새로운 숫자 원시 타입),
Promise.allSettled(짧은 회로 없음), globalThis(글로벌 this 값 접근의 범용 방법),
모듈 내 export * as ns from 'module' 문법, for-in 열거 순서의 표준화 강화, 모듈 내에서 컨텍스트 정보를 담을
수 있는 import.meta 객체, nullish 값(undefined 또는 null )을
다루기 위한 새로운 문법(nullish 병합 연산자, 옵셔널 체이닝 연산자) 등을 도입했습니다.
ECMAScript 2021, 12번째 에디션은 문자열의 replaceAll 메서드, Promise.any(입력값이
fulfill될 때 짧은 회로), AggregateError(여러 오류를 한 번에 표현하는 새로운 오류 타입), 논리 할당 연산자(??=,
&&=, ||=), WeakRef(가비지 컬렉션에서 객체를 보존하지 않고 참조),
FinalizationRegistry(가비지 컬렉션 시 정리 작업 등록 및 해제 관리), 숫자 리터럴 구분자(1_000),
Array.prototype.sort의 구현 정의 정렬 순서 정렬 순서 의 경우 감소 등 다양한 기능을 도입했습니다.
ECMAScript 2022, 13번째 에디션은 모듈의 최상위에서 await 사용을 허용하는 기능, 클래스 내의 새로운 요소(퍼블릭 및 프라이빗
인스턴스 필드, 퍼블릭 및 프라이빗 정적 필드, 프라이빗 인스턴스 메서드 및 접근자, 프라이빗 정적 메서드 및 접근자), 클래스 내 정적 블록(클래스별 평가 초기화 수행),
#x in obj 문법(객체에 프라이빗 필드 존재 여부 테스트), /d 플래그(정규식 매치 인덱스 제공), Error
객체의 cause 속성(에러의 원인 연쇄 기록), 문자열, 배열, TypedArray 의 at 메서드(상대 인덱싱 지원),
Object.hasOwn(Object.prototype.hasOwnProperty의 편리한 대안) 등을 도입했습니다.
ECMAScript 2023, 14번째 에디션은 Array.prototype 및 TypedArray.prototype에
toSorted, toReversed, with, findLast,
findLastIndex 메서드, Array.prototype의 toSpliced 메서드, 파일 시작 부분에
#! 주석 지원(실행 가능한 ECMAScript 파일 지원 향상), 대부분의 심볼을 weak 컬렉션의 키로 사용 가능 등 기능을 도입했습니다.
ECMAScript 2024, 15번째 에디션은 ArrayBuffer 및 SharedArrayBuffer의 리사이즈 및 전송 기능, 문자열 집합 작업을 위한 고급 기능의
새로운 RegExp /v 플래그, Promise 생성 편의 메서드 Promise.withResolvers, 데이터 집계용
Object.groupBy 및 Map.groupBy 메서드, 공유 메모리 변경을 비동기적으로 대기하는
Atomics.waitAsync 메서드, 문자열의 올바른 유니코드만 포함되는지 검사 및 보장하는
String.prototype.isWellFormed 및 String.prototype.toWellFormed 메서드 등을 도입했습니다.
ECMAScript 2025, 16번째 에디션은 이터레이터 작업을 위한 새로운 Iterator 글로벌과 관련 정적
및 프로토타입 메서드, Set.prototype의 일반적 셋 연산 메서드, JSON 모듈 import 및 import된 모듈의 속성 선언 문법, 정규식 내 안전한
문자열 사용을 위한 RegExp.escape 메서드, 정규식 내에서 인라인으로 modifier 플래그 활성/비활성화 문법, 함수의 반환값이 프라미스일 수도 아닐
수도 있을 때 항상 프라미스로 반환하는 Promise.try 메서드, 새로운 Float16Array TypedArray 종류와 관련
DataView.prototype.getFloat16, DataView.prototype.setFloat16,
Math.f16round 메서드를 도입했습니다.
Ecma TC39 내에서 많은 조직을 대표하는 수십 명의 개인이 이 에디션과 이전 에디션의 개발에 매우 중요한 기여를 했습니다. 또한 TC39의 ECMAScript 작업을 지원하는 활발한
커뮤니티가 생겨났습니다. 이 커뮤니티는 수많은 초안 검토, 수천 건의 버그 리포트 제출, 구현 실험, 테스트 스위트 기여, ECMAScript에 대한 전 세계 개발자 교육 등 다양한
활동을 했습니다. 모든 기여자와 조직을 식별하고 인정하는 것은 불가능합니다.
Allen Wirfs-Brock
ECMA-262, 프로젝트 에디터, 6번째 에디션
Brian Terlson
ECMA-262, 프로젝트 에디터, 7번째 ~ 10번째 에디션
Jordan Harband
ECMA-262, 프로젝트 에디터, 10번째 ~ 12번째 에디션
Shu-yu Guo
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
Michael Ficarra
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
Kevin Gibbons
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션
1 범위
이 표준은 ECMAScript 2026 범용 프로그래밍 언어를 정의합니다.
2 적합성
ECMAScript의 준수 구현체는 이 명세서에 기술된 모든 타입, 값, 객체, 프로퍼티, 함수, 프로그램 구문 및 의미론을 제공하고 지원해야 합니다.
ECMAScript의 준수 구현체는 소스 텍스트 입력을 최신 버전의 유니코드 표준 및 ISO/IEC 10646에 따라 해석해야 합니다.
다양한 인간 언어와 국가에서 사용되는 언어적, 문화적 관습에 적응이 필요한 프로그램을 지원하는 API를 제공하는 ECMAScript의 준수 구현체는 이 명세서와 호환되는 ECMA-402의
최신판에서 정의된 인터페이스를 구현해야 합니다.
ECMAScript의 준수 구현체는 이 명세서에 기술된 것 이외의 추가 타입, 값, 객체, 프로퍼티, 함수 등을 제공할 수 있습니다. 특히, 준수 구현체는 명세서에 기술되지 않은 프로퍼티와
그 값, 그리고 명세서에 기술된 객체에 대해 추가 프로퍼티를 제공할 수 있습니다.
ECMAScript의 준수 구현체는 이 명세서에 기술되지 않은 프로그램 및 정규식 구문을 지원할 수 있습니다. 특히, 준수 구현체는 이 명세서의 예약어 로 지정된 “미래 12.7.2 ”를 사용하는 프로그램 구문을 지원할 수 있습니다.
ECMAScript의 준수 구현체는 17.1 절에서 금지 확장으로 명시된 어떤 확장도 구현해서는 안 됩니다.
ECMAScript의 준수 구현체는 구현 정의 , 구현
근사 , 또는 호스트
정의 가 아닌 어떤 기능도 재정의해서는 안 됩니다.
ECMAScript의 준수 구현체는 규범적 선택 사항 절을 구현할지 말지 선택할 수 있습니다. 어떤 규범적 선택 사항 동작을 구현하는 경우,
해당 규범적 선택 사항 절의 모든 동작을 구현해야 합니다. 규범적 선택 사항 절은 아래와 같이 색상 박스에 “Normative Optional”이라는 단어로 표시됩니다.
2.1 규범적 선택 사항 절 제목 예시
절 내용 예시.
ECMAScript의 준수 구현체는 규범적 선택 사항으로도 표시되지 않는 레거시 절을 반드시 구현해야 합니다. 레거시 절 내에 명시된 모든 언어
기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지고 있습니다. 그러나 기존 애플리케이션에서 계속 사용되고 있기 때문에 이 명세서에서 제거할 수 없습니다. 이러한 기능은
ECMAScript 언어의 핵심에 해당하지 않습니다. 새로운 ECMAScript 코드를 작성할 때 프로그래머는 이러한 기능과 동작을 사용하거나 존재를 가정해서는 안 됩니다.
2.2 레거시 절 제목 예시
절 내용 예시.
2.3 레거시 규범적 선택 사항 절 제목 예시
절 내용 예시.
3 규범적 참고문헌
다음에 참조된 문서는 이 문서의 적용에 필수적입니다. 날짜가 명시된 참고문헌의 경우, 인용된 판만 적용됩니다. 날짜가 명시되지 않은 참고문헌의 경우, 해당 문서의 최신판(모든 개정 포함)이
적용됩니다.
IEEE
754-2019 , IEEE 부동소수점 산술 표준 .
유니코드 표준.
https://unicode.org/versions/latest
ISO/IEC 10646, 정보 기술 — 범용 다중-옥텟 인코딩 문자 집합(UCS) 및 Amendment 1:2005, Amendment 2:2006, Amendment
3:2008, Amendment 4:2008, 그리고 추가 개정 및 정오표, 또는 후속판.
ECMA-402, ECMAScript 국제화 API 명세 , 특히 이 명세의 해당 연도판.
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/
ECMA-404, JSON 데이터 교환 포맷 .
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
4 개요
이 절은 ECMAScript 언어에 대한 비규범적 개요를 포함합니다.
ECMAScript는 호스트
환경 내에서 계산을 수행하고 계산 객체를 조작하기 위한 객체 지향 프로그래밍 언어입니다. 여기서 정의된 ECMAScript는 계산적으로
자급자족하는 것을 목표로 하지 않습니다. 실제로, 이 명세에는 외부 데이터 입력이나 계산 결과 출력을 위한 규정이 없습니다. 대신, ECMAScript 프로그램의 계산 환경은 이 명세에
설명된 객체 및 기타 기능뿐만 아니라, 환경별 객체도 제공할 것으로 예상되며, 이러한 객체의 설명과 동작은 이 명세의 범위를 벗어나지만 특정 속성에 접근하거나 ECMAScript
프로그램에서 호출할 수 있는 함수가 있을 수 있음을 나타냅니다.
ECMAScript는 원래 스크립트 언어로 설계되었으나, 현재는 범용 프로그래밍 언어로 널리 사용되고 있습니다. 스크립트 언어 는 기존 시스템의 기능을 조작, 사용자화,
자동화하는 데 사용되는 프로그래밍 언어입니다. 이러한 시스템에서는 이미 유용한 기능이 사용자 인터페이스를 통해 제공되고, 스크립트 언어는 해당 기능을 프로그램 제어로 노출하는 수단입니다.
이렇게 기존 시스템이 호스트
환경 의 객체와 기능을 제공하여 스크립트 언어의 역량을 완성합니다. 스크립트 언어는 전문가와 비전문가 모두 사용할 수 있도록 설계되었습니다.
ECMAScript는 원래 웹 스크립트 언어 로 설계되어 브라우저에서 웹 페이지에 생동감을 부여하거나 웹 기반 클라이언트-서버 구조에서 서버 계산을 수행하는 메커니즘을
제공했습니다. ECMAScript는 이제 다양한 호스트 환경 에서 핵심 스크립트 기능을 제공합니다. 따라서 핵심 언어는 특정 호스트 환경 과 별도로 이
문서에서 명세됩니다.
ECMAScript의 사용은 단순 스크립트에서 벗어나 현재는 여러 환경과 규모에서 모든 프로그래밍 작업에 사용됩니다. ECMAScript의 사용이 확장됨에 따라 제공하는 기능과 설비도
확장되었습니다. ECMAScript는 이제 완전한 범용 프로그래밍 언어입니다.
4.1 웹 스크립팅
웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript 호스트 환경 을 제공합니다. 여기에는 예를 들어, 창, 메뉴, 팝업, 대화 상자, 텍스트 영역,
앵커, 프레임, 히스토리, 쿠키, 입출력을 나타내는 객체 등이 포함됩니다. 또한 호스트 환경 은 포커스 변경, 페이지 및 이미지 로딩, 언로드, 오류 및 중단, 선택, 폼
제출, 마우스 동작 등 이벤트에 스크립트 코드를 연결하는 방법을 제공합니다. 스크립트 코드는 HTML 내에 나타나며, 표시되는 페이지는 사용자 인터페이스 요소와 고정 및 계산된
텍스트 및 이미지의 조합입니다. 스크립트 코드는 사용자 상호작용에 반응하며, 메인 프로그램이 필요하지 않습니다.
웹 서버는 요청, 클라이언트, 파일을 나타내는 객체, 데이터 잠금 및 공유 메커니즘 등 서버 측 계산을 위한 별도의 호스트 환경 을 제공합니다. 브라우저 측과 서버 측 스크립팅을 함께
사용하면, 사용자 맞춤형 웹 애플리케이션에서 클라이언트와 서버 간에 계산을 분산시킬 수 있습니다.
ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체 호스트 환경 을 제공하여 ECMAScript 실행 환경을 완성합니다.
4.2 호스트와 구현체
호스트 환경 에
ECMAScript 통합을 돕기 위해, 이 명세는 특정 기능(예: 추상 연산 )의
정의를 전체 또는 일부 외부 소스에 위임합니다. 편집상, 이 명세는 다음과 같은 위임 유형을 구분합니다.
구현체 는 부록 D 에 열거된 기능이나 구현
정의 또는 구현 근사 로 표시된 기능을 외부에서 추가 정의하는 소스입니다.
비공식적으로, 구현체는 특정 웹 브라우저와 같은 구체적인 산출물을 의미합니다.
구현 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하는 기능입니다. 이
명세는 특정 동작에 대한 권고를 하지 않으며, 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있습니다.
구현 근사 기능은 이상적인 동작을 권고하면서 정의를 외부 소스에 위임하는
기능입니다. 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있지만, 이상적인 동작에 근접하도록 노력해야 합니다. Math.exp 와
같은 일부 수학 연산은 구현 근사 에 해당합니다.
호스트 는 부록 D 에 열거된 기능을 추가 정의하지만, 그 외의 구현
정의 또는 구현 근사 기능은 추가 정의하지 않는 외부 소스입니다. 비공식적으로,
호스트 는 부록 D 를 통해 이 명세와 같은 방식으로 연결되는 모든 구현체 집합(모든 웹 브라우저
집합 등)을 의미합니다. 호스트 는 종종 WHATWG
HTML(https://html.spec.whatwg.org/ )과 같은 외부 명세입니다. 즉,
호스트 정의 기능은 종종
외부 명세에서 추가로 정의됩니다.
호스트 후크 는 전체 또는 일부가 외부 소스에 의해 정의되는 추상
연산입니다. 모든 호스트 후크 는 부록
D 에 나열되어야 합니다. 호스트 후크 는 최소한 다음 요구사항을 충족해야 합니다:
호스트 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하며, 부록 D 에 나열되어야 합니다. 호스트 가 아닌 구현체도 호스트 정의 기능에 대한 정의를 제공할 수 있습니다.
호스트 환경 은 모든 호스트 정의 기능에 대한 구체적 정의
선택입니다. 호스트
환경 에는 일반적으로 호스트 정의 속성으로 입력을 얻거나 출력을 제공하는 객체 또는 함수가 포함되고, 이는
글로벌
객체 에 속합니다.
이 명세는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따릅니다. 예를 들어, 어떤 기능이 호스트 정의 라면, 구현 정의 로 언급해서는 안 됩니다.
호스트 와 구현체 모두 이 명세가 정의한 언어 타입, 명세
타입, 추상 연산 , 문법 생성규칙, 내장 객체,
내장 심볼을 통해 이 명세와 인터페이스할 수 있습니다.
4.3 ECMAScript 개요
다음은 ECMAScript에 대한 비공식적 개요입니다. 언어의 모든 부분이 설명된 것은 아니며, 이 개요는 표준의 일부가 아닙니다.
ECMAScript는 객체 기반입니다. 기본 언어 및 호스트 기능이 객체로 제공되며, ECMAScript 프로그램은 서로 통신하는 객체 집합입니다.
ECMAScript에서 객체 는 0개 이상의 프로퍼티 로 이루어진 컬렉션이며, 각 프로퍼티는 해당 프로퍼티의 사용 방식을 결정하는
속성 을 가집니다. 예를 들어, 프로퍼티의 Writable 속성이 false 로 설정된 경우, ECMAScript 코드가 해당
프로퍼티에 다른 값을 할당하려는 모든 시도는 실패합니다. 프로퍼티는 다른 객체, 프리미티브 값 , 또는 함수 를 저장하는 컨테이너입니다. 프리미티브
값은 다음 내장 타입 중 하나에 속합니다: Undefined , Null , Boolean , Number , BigInt ,
String , Symbol ; 객체는 내장 타입 Object 에 속하며, 함수는 호출 가능한 객체입니다. 객체에 프로퍼티로 연결된 함수를
메서드 라고 합니다.
ECMAScript는 ECMAScript 엔티티 정의를 완성하는 내장 객체 집합도 정의합니다. 이러한 내장 객체에는 글로벌 객체 , 언어의
런타임
의미론 에 기본적인 객체들(Object, Function, Boolean, Symbol, 다양한 Error 객체), 숫자 값을 나타내고
조작하는 객체들(Math, Number, Date), 텍스트 처리 객체(String, RegExp), 값이 인덱스된 컬렉션(Array 및 9종의 Typed Array), 키 기반
컬렉션(Map, Set 객체), 구조화된 데이터 지원(JSON 객체, ArrayBuffer, SharedArrayBuffer, DataView), 제어 추상화를 지원하는
객체(제너레이터 함수, Promise 객체), 그리고 반영 객체(Proxy, Reflect)가 포함됩니다.
ECMAScript는 내장 연산자 집합도 정의합니다. ECMAScript 연산자에는 다양한 단항 연산, 곱셈 연산자, 덧셈 연산자, 비트 시프트 연산자, 관계
연산자, 동등성 연산자, 이진 비트 연산자, 이진 논리 연산자, 할당 연산자, 쉼표 연산자가 포함됩니다.
대규모 ECMAScript 프로그램은 모듈 을 통해 지원되며, 프로그램을 여러 문(statement) 및 선언(declaration) 시퀀스로 분할할 수 있습니다. 각
모듈은 다른 모듈에서 제공되어야 할 선언과, 다른 모듈에서 사용할 수 있는 자신의 선언을 명시적으로 식별합니다.
ECMAScript 문법은 의도적으로 Java 문법과 유사하게 설계되었습니다. ECMAScript 문법은 쉽게 사용할 수 있는 스크립트 언어가 되도록 완화되어 있습니다. 예를 들어,
변수는 타입 선언이 필요하지 않으며, 프로퍼티에 타입이 연결되지 않고, 정의된 함수도 호출보다 먼저 선언될 필요가 없습니다.
4.3.1 객체
ECMAScript에는 클래스 정의 구문이 포함되어 있지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 언어의 객체처럼 근본적으로 클래스 기반이
아닙니다. 대신, 객체는 리터럴 표기법이나 생성자 를 통해 여러 방식으로 생성될 수 있으며, 생성자는 객체를 생성한 후 초기
값을 프로퍼티에 할당하여 객체 전체 또는 일부를 초기화하는 코드를 실행합니다. 각 생성자 는 "prototype" 이라는 프로퍼티를 가지는 함수로,
프로토타입 기반 상속 및 공유 프로퍼티 를 구현합니다. 객체는 new 표현식에서 생성자 를 사용하여 생성됩니다. 예를
들어, new Date(2009, 11)은 새로운 Date 객체를 생성합니다. new 없이 생성자 를 호출하면, 그 결과는
생성자 에 따라 다릅니다.
예를 들어, Date()는 객체가 아니라 현재 날짜와 시간의 문자열 표현을 반환합니다.
생성자 로 생성된 모든
객체는 암시적 참조(객체의 프로토타입 이라 함)를 가지며, 이는 해당 생성자 의 "prototype" 프로퍼티 값입니다. 또한,
프로토타입은 자신의 프로토타입에 대한 null 이 아닌 암시적 참조를 가질 수 있습니다. 이를 프로토타입 체인 이라고 합니다.
객체의 프로퍼티에 대한 참조가 이루어지면, 해당 참조는 프로토타입 체인에서 그 이름의 프로퍼티를 가진 첫 번째 객체의 프로퍼티에 대한 참조입니다. 즉, 먼저 직접 언급된
객체에서 프로퍼티를 찾고, 해당 객체에 프로퍼티가 있으면 그 프로퍼티를 참조하며, 없다면 그 객체의 프로토타입을 다음으로 검사합니다.
그림 1: 객체/프로토타입 관계
클래스 기반 객체 지향 언어에서는 일반적으로 상태는 인스턴스가, 메서드는 클래스가 가지며, 상속은 구조와 동작에만 적용됩니다. ECMAScript에서는 상태와 메서드가 객체에
포함되며, 구조, 동작, 상태 모두 상속됩니다.
프로토타입에 특정 프로퍼티가 있지만 직접 해당 프로퍼티를 가지지 않는 모든 객체는 그 프로퍼티와 값을 공유합니다. 그림 1은 이를 보여줍니다:
CF 는 생성자 (그리고 객체)입니다. new 표현식을 통해 5개 객체가 생성되었습니다:
cf1 ,
cf2 , cf3 , cf4 , cf5 .
각 객체는 "q1" 및 "q2" 라는 프로퍼티를 가집니다. 점선은 암시적 프로토타입 관계를 나타냅니다.
예를 들어, cf3 의 프로토타입은 CFp 입니다. 생성자 CF 는 두 개의
프로퍼티("P1" , "P2" )를 가지지만, CFp ,
cf1 , cf2 , cf3 , cf4 ,
cf5 에서는 볼 수 없습니다. CFp 의 "CFP1" 프로퍼티는
cf1 , cf2 , cf3 , cf4 ,
cf5 에서 공유되며(CF 에서는 공유되지 않음), CFp 의 암시적 프로토타입 체인에서
"q1" , "q2" , "CFP1" 이 아닌 다른 프로퍼티도 마찬가지로
공유됩니다. CF 와 CFp 사이에는 암시적 프로토타입 링크가 없습니다.
대부분의 클래스 기반 객체 언어와 달리, 객체에는 값을 할당하여 동적으로 프로퍼티를 추가할 수 있습니다. 즉, 생성자 는 생성된 객체의 모든 프로퍼티를 반드시 명명하거나 값을 할당할
필요가 없습니다. 위 다이어그램에서 cf1 , cf2 , cf3 ,
cf4 , cf5 에 대해 CFp 에 새 값을 할당하여 새로운 공유 프로퍼티를
추가할 수 있습니다.
ECMAScript 객체는 본질적으로 클래스 기반은 아니지만, 공통된 생성자 함수, 프로토타입 객체, 메서드 패턴에 기반하여 클래스와 유사한 추상화를 정의하는 것이
편리한 경우가 많습니다. ECMAScript 내장 객체 자체도 이러한 클래스와 유사한 패턴을 따릅니다. ECMAScript 2015부터 ECMAScript 언어에는 내장
객체가 사용하는 클래스와 유사한 추상화 패턴에 맞는 객체를 간결하게 정의할 수 있는 문법적 클래스 정의가 포함되어 있습니다.
4.3.2 ECMAScript의 엄격 변형(strict variant)
ECMAScript 언어는 일부 사용자가 언어의 일부 기능 사용을 제한하고자 할 수도 있음을 인식합니다. 이는 보안, 오류 발생 가능성이 높은 기능 회피, 향상된 오류 검사,
기타 이유 등으로 이루어질 수 있습니다. 이를 지원하기 위해, ECMAScript는 엄격 변형(strict variant)을 정의합니다. 엄격 변형은 일반
ECMAScript 언어의 일부 구문적·의미론적 기능을 제외하고, 일부 기능의 상세 의미론을 수정합니다. 엄격 변형에서는 비엄격(non-strict) 언어 형태에서는 오류로
지정되지 않은 상황에서도 오류 예외를 던져야 하는 추가 오류 조건도 지정합니다.
ECMAScript의 엄격 변형은 일반적으로 언어의 엄격 모드(strict mode) 라고 불립니다. 엄격 모드 선택 및 엄격 모드 구문과 의미론 사용은
ECMAScript 소스
텍스트 단위 수준에서 명시적으로 이루어지며, 이는 11.2.2 에서 설명되어 있습니다. 엄격 모드는 구문 소스
텍스트 단위 수준에서 선택되므로, 엄격 모드는 해당 소스 텍스트 단위 내에서만 국지적으로 적용되는 제한을 부과합니다. 엄격 모드는 여러 소스 텍스트 단위에 걸쳐 일관되게
동작해야 하는 ECMAScript 의미론의 어떤 측면도 제한하거나 수정하지 않습니다. 완전한 ECMAScript 프로그램은 엄격 모드 및 비엄격 모드 ECMAScript 소스
텍스트 단위를 모두 포함할 수 있습니다. 이 경우, 실제로 엄격 모드 소스 텍스트 단위 내에서 정의된 코드를 실행할 때만 엄격
모드가 적용됩니다.
이 명세를 준수하려면, ECMAScript 구현체는 이 명세에서 정의된 전체 제한 없는 ECMAScript 언어와 엄격 변형 ECMAScript 언어를 모두 구현해야 합니다.
또한, 구현체는 제한 없는 소스 텍스트 단위와 엄격 모드 소스 텍스트 단위를 하나의 복합 프로그램으로 결합하는 것도 지원해야 합니다.
4.4 용어 및 정의
이 문서의 목적상, 다음 용어와 정의가 적용됩니다.
4.4.1 implementation-approximated
implementation-approximated 기능은 외부
소스에 의해 전체 또는 일부가 정의되지만, 이 명세서에서 권장되는 이상적인 동작을 가집니다.
4.4.2 implementation-defined
implementation-defined 기능은 이 명세서 외부의 소스에
의해 전체 또는 일부가 정의됩니다.
4.4.3 host-defined
implementation-defined 와 동일합니다.
참고
4.4.4 type
6 절에서 정의된 데이터 값 집합
4.4.5 primitive value
Undefined, Null, Boolean, Number, BigInt, Symbol, String 타입 중 하나의 멤버로, 6 절에서 정의됨
참고
프리미티브 값은 언어 구현의 가장 낮은 수준에서 직접적으로 표현되는 데이터입니다.
4.4.6 object
Object 타입의 멤버
참고
객체는 프로퍼티의 집합이며 단일 프로토타입 객체를 가집니다. 프로토타입은 null 일 수 있습니다.
4.4.7 constructor
객체를 생성하고 초기화하는 함수
객체
참고
constructor 의 "prototype"
프로퍼티 값은 상속과 공유 프로퍼티를 구현하는 프로토타입 객체입니다.
4.4.8 prototype
다른 객체에 공유 프로퍼티를 제공하는 객체
참고
constructor 가 객체를 생성하면, 그 객체는 프로퍼티 참조를 해결하기 위해
constructor 의 "prototype"
프로퍼티를 암시적으로 참조합니다. constructor 의 "prototype"
프로퍼티는 프로그램 표현식 constructor .prototype으로 참조할 수 있습니다. 객체의 프로토타입에
프로퍼티를 추가하면, 그 프로토타입을 공유하는 모든 객체가 상속을 통해 해당 프로퍼티를 공유합니다. 또는, Object.create
내장 함수를 사용하여 명시적으로 지정된 프로토타입으로 새 객체를 생성할 수도 있습니다.
4.4.9 ordinary object
모든 객체가 지원해야 하는 필수 내부 메서드에 대해 기본 동작을 가지는 객체
4.4.10 exotic object
필수 내부 메서드 중 하나 이상에 대해 기본 동작을 가지지 않는 객체
참고
4.4.11 standard object
이 명세서에서 의미론이 정의된 객체
4.4.12 built-in object
ECMAScript 구현체에 의해 명세되고 제공되는 객체
참고
표준 내장 객체는 이 명세서에서 정의되어 있습니다. ECMAScript 구현체는 추가 내장 객체 종류를 명세하고 제공할 수 있습니다.
4.4.13 undefined value
변수가 값이 할당되지 않았을 때 사용되는 프리미티브 값
4.4.14 Undefined type
유일한 값이 undefined 인 타입
4.4.15 null value
어떤 객체 값도 의도적으로 존재하지 않음을 나타내는 프리미티브 값
4.4.16 Null type
유일한 값이 null 인 타입
4.4.17 Boolean value
Boolean type 의 멤버
참고
Boolean 값은 true 와 false 단 두 가지입니다.
4.4.18 Boolean type
true 와 false 프리미티브 값으로 구성된 타입
4.4.19 Boolean object
표준 내장 Boolean 생성자 의 인스턴스인 Object type 의 멤버
참고
Boolean 객체는 new 표현식에서 Boolean 생성자 를 사용하여 Boolean 값을 인자로 전달하여
생성됩니다. 결과 객체는 Boolean 값을 가지는 내부 슬롯을 갖습니다. Boolean 객체는 Boolean 값으로 강제 변환될 수 있습니다.
4.4.20 String value
finite 16비트 부호 없는
integer 값의 0개 이상의 순서
있는 시퀀스인 프리미티브 값
참고
문자열 값은 String type 의
멤버입니다. 시퀀스 내 각 integer 값은 일반적으로 UTF-16 텍스트의 16비트 단위를 나타냅니다. 그러나
ECMAScript는 값에 대해 16비트 부호 없는 integer 이어야 한다는 것 외에는 제한이나 요구사항을 두지 않습니다.
4.4.21 String type
모든 가능한 문자열 값의 집합
4.4.22 String object
표준 내장 String 생성자 의 인스턴스인 Object type 의 멤버
참고
문자열 객체는 new 표현식에서 String 생성자 를 사용하여 문자열 값을 인자로 전달하여 생성됩니다. 결과 객체는 문자열
값을 가지는 내부 슬롯을 갖습니다. 문자열 객체는 String 생성자 를 함수로 호출하여 문자열 값으로 강제 변환할 수 있습니다
(22.1.1.1 ).
4.4.23 Number value
프리미티브 값으로, IEEE
754-2019 값에 해당하는 배정밀도 64비트 이진 형식 값
참고
숫자 값은 Number type 의
멤버이며, 숫자의 직접적인 표현입니다.
4.4.24 Number type
NaN (“not a number”), +∞ 𝔽 (양의 무한대),
-∞ 𝔽 (음의 무한대)을 포함한 모든 가능한 Number 값의 집합
4.4.25 Number object
표준 내장 Number 생성자 의 인스턴스인 Object type 의 멤버
참고
Number 객체는 new 표현식에서 Number 생성자 를 사용하여 숫자 값을 인자로 전달하여 생성됩니다. 결과 객체는 숫자 값을
가지는 내부 슬롯을 갖습니다. Number 객체는 Number 생성자 를 함수로 호출하여 숫자 값으로 강제 변환할 수 있습니다 (21.1.1.1 ).
4.4.26 Infinity
양의 무한대 숫자 값
4.4.27 NaN
IEEE
754-2019 NaN(“not a number”) 값인 숫자 값
4.4.28 BigInt value
임의 정밀도의 integer 값에
해당하는 프리미티브 값
4.4.29 BigInt type
모든 가능한 BigInt 값의 집합
4.4.30 BigInt object
표준 내장 BigInt 생성자 의 인스턴스인 Object type 의 멤버
4.4.31 Symbol value
고유하며, 문자열이 아닌 객체 프로퍼티
키 를 나타내는 프리미티브 값
4.4.32 Symbol type
모든 가능한 심볼 값의 집합
4.4.33 Symbol object
표준 내장 Symbol 생성자 의 인스턴스인 Object type 의 멤버
4.4.34 function
서브루틴으로 호출될 수 있는 Object type 의 멤버
참고
함수는 자신의 프로퍼티 외에도, 호출될 때 동작을 결정하는 실행 코드와 상태를 포함합니다. 함수의 코드는 ECMAScript로 작성되었을 수도 있고 아닐 수도
있습니다.
4.4.35 built-in function
함수인 내장 객체
참고
내장 함수의 예로 parseInt와 Math.exp가 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 함수를
제공할 수 있습니다.
4.4.36 built-in constructor
생성자 인 내장 함수
참고
내장 생성자 의 예로 Object와
Function이 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 생성자 를 제공할 수
있습니다.
4.4.37 property
키(String 값 또는 Symbol 값)와 값을 연결하는 객체의 일부
참고
프로퍼티의 형태에 따라 값은 데이터 값(프리미티브 값, 객체 또는 함수 객체 )으로 직접 표현되거나, 접근자 함수 쌍으로 간접적으로 표현될 수
있습니다.
4.4.38 method
프로퍼티 값인 함수
참고
함수가 객체의 메서드로 호출될 때, 해당 객체는 함수의 this 값으로 전달됩니다.
4.4.39 built-in method
내장 함수인 메서드
참고
표준 내장 메서드는 이 명세서에서 정의되어 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 메서드를 제공할 수 있습니다.
4.4.40 attribute
프로퍼티의 특성을 정의하는 내부 값
4.4.41 own property
해당 객체에 직접 포함된 프로퍼티
4.4.42 inherited property
객체의 프로퍼티 중 직접 포함된 것이 아니지만, 객체의 프로토타입(직접 또는 상속된)에 있는 프로퍼티
4.5 이 명세의 구성
이 명세의 나머지 부분은 다음과 같이 구성되어 있습니다:
5 절에서는 명세 전체에서 사용되는 표기 관례를 정의합니다.
6 절부터 10 절까지는 ECMAScript 프로그램이
동작하는 실행 환경을 정의합니다.
11 절부터 17 절까지는 모든 언어 기능의 구문적 인코딩과
실행 의미론을 포함하여 실제 ECMAScript 프로그래밍 언어를 정의합니다.
18 절부터 28 절까지는 ECMAScript
표준 라이브러리를 정의합니다. 여기에는 ECMAScript 프로그램이 실행 시 사용할 수 있는 모든 표준 객체의 정의가 포함됩니다.
29 절에서는
SharedArrayBuffer 기반 메모리의 접근 및 Atomics 객체 메서드의 메모리 일관성 모델을 설명합니다.
5 표기 규칙
5.1 구문 및 렉시컬 문법
5.1.1 문맥 자유 문법
문맥 자유 문법 은 여러 개의 생산 으로 구성됩니다. 각 생산은 비단말 기호 라는 추상적인 기호를 왼쪽 에 가지고,
0개 이상의 비단말 및 단말 기호 를 오른쪽 에 나열합니다. 각 문법에서 단말 기호는 지정된 알파벳에서 가져옵니다.
연쇄 생산 이란 오른쪽에 정확히 하나의 비단말 기호와 0개 이상의 단말 기호만을
가지는 생산을 말합니다.
특정 문맥 자유 문법은 목표 기호 라 불리는 하나의 구별된 비단말로 구성된 문장에서
시작하여, 시퀀스 내의 아무 비단말이나 그 비단말이 왼쪽이 되는 생산의 오른쪽으로 반복적으로 대체함으로써 결과적으로 생성할 수 있는 단말 기호의 모든 가능한 시퀀스
집합(언어 )을 지정합니다. 이 집합은 유한하거나 무한할 수 있습니다.
5.1.2 렉시컬 및 정규식 문법
ECMAScript의 렉시컬 문법 은 12 절에 제공됩니다. 이
문법의 단말 기호는 SourceCharacter 에서 정의된 규칙에 따라 Unicode 코드
포인트입니다(11.1 참조). 이 문법은 목표
기호 InputElementDiv , InputElementTemplateTail , InputElementRegExp , InputElementRegExpOrTemplateTail ,
InputElementHashbangOrRegExp 등에서
시작하여, 이러한 코드 포인트 시퀀스가 입력 요소 시퀀스로 번역되는 방식을 정의합니다.
공백 문자와 주석을 제외한 입력 요소는 ECMAScript의 구문 문법의 단말 기호가 되며, 이를 ECMAScript 토큰 이라 부릅니다. 이 토큰들은
예약어 , 식별자, 리터럴, ECMAScript 언어의
구분자입니다. 또한, 줄 종결자는 토큰으로 간주되지 않지만 입력 요소 스트림의 일부가 되어 자동 세미콜론 삽입 과정(12.10 )을 안내합니다. 단순 공백 및 한 줄 주석은
버려지며, 구문 문법을 위한 입력 요소 스트림에는 나타나지 않습니다. MultiLineComment (즉, 여러 줄에 걸쳐 있을 수 있는
/*…*/ 형태의 주석)는 줄 종결자가 없으면 단순히 버려집니다. 그러나 MultiLineComment 가 하나 이상의 줄 종결자를 포함하는 경우, 단일 줄
종결자로 대체되어 구문 문법을 위한 입력 요소 스트림의 일부가 됩니다.
ECMAScript의 정규식 문법 은 22.2.1 에 제공됩니다. 이 문법 역시 SourceCharacter 로 정의된 코드 포인트를 단말 기호로 사용합니다. 이
문법은 목표 기호 Pattern 에서 시작하여, 코드 포인트 시퀀스가 정규식 패턴으로 변환되는 방법을 설명합니다.
렉시컬 및 정규식 문법의 생산은 구분 기호로 두 개의 콜론 “:: ”을 사용하여 구분됩니다. 렉시컬 문법과 정규식 문법은 일부 생산을 공유합니다.
5.1.3 숫자 문자열 문법
숫자 문자열 문법 은 7.1.4.1 에서 나타납니다. 이 문법은
SourceCharacter 를 단말 기호로
사용하며, 목표 기호 StringNumericLiteral 에서 시작하여 문자열을 숫자 값으로
변환하는 데 사용됩니다(이는 숫자 리터럴의 렉시컬 문법 과 유사하지만 다릅니다).
숫자 문자열 문법의 생산은 세 개의 콜론 “::: ”으로 구분되며, 소스 텍스트 파싱에는 절대 사용되지 않습니다.
5.1.4 구문 문법
ECMAScript의 구문 문법 은 13 부터 16 까지의 절에 제공됩니다. 이 문법은
렉시컬 문법에서 정의된 ECMAScript 토큰을 단말 기호로 사용합니다(5.1.2 ). 목표
기호 Script 와
Module 에서 시작하여, 토큰 시퀀스가 ECMAScript
프로그램의 구문적으로 올바른 독립 구성 요소를 형성하는 방법을 설명합니다.
코드 포인트 스트림을 ECMAScript Script 또는
Module 로 파싱할 때, 먼저 렉시컬 문법을 반복적으로 적용하여
입력 요소 스트림으로 변환합니다. 그 후 이 입력 요소 스트림을 단일 구문 문법 적용으로 파싱합니다. 입력 스트림의 토큰들이 목표 비단말(Script 또는 Module )의 단일 인스턴스로 파싱될 수 없거나 토큰이 남아 있다면 구문 오류입니다.
파싱에 성공하면, 파싱 트리 라는 루트가 있는 트리 구조를 생성합니다. 각 노드는 파싱 노드 입니다. 각 파싱 노드는 문법 기호의 인스턴스 이며, 해당 기호로부터 유도될 수 있는 소스 텍스트의 범위를
나타냅니다. 파싱 트리의 루트 노드(소스 텍스트 전체를 나타냄)는 파싱의 목표 기호 의 인스턴스입니다. 파싱 노드가
비단말의 인스턴스인 경우, 그 비단말을 왼쪽으로 하는 생산의 인스턴스이기도 합니다. 또한, 오른쪽에 있는 각 기호마다 0개 이상의 자식 을 가지며, 각 자식은
해당 기호의 파싱 노드 인스턴스입니다.
새로운 파싱 노드는 파서 호출마다 인스턴스화되며 동일한 소스 텍스트라도 파싱 간에는 재사용되지 않습니다. 파싱 노드는 동일한 소스 텍스트 범위를 나타내고, 동일한 문법 기호의
인스턴스이며, 동일한 파서 호출에서 생성된 경우에만 동일한 파싱 노드 로 간주됩니다.
참고 1
동일한 문자열을 여러 번 파싱하면 서로 다른 파싱 노드가 생성됩니다. 예를 들어,
let str = "1 + 1;" ;
eval (str);
eval (str);
각 eval 호출은 str의 값을 ECMAScript 소스 텍스트 로 변환하고, 각기
독립적으로 파싱하여 별도의 파싱 노드 트리를 생성합니다. 각 파싱은 동일한 문자열 값에서 유래했더라도 트리는 서로 다릅니다.
참고 2
파싱 노드는 명세상의 산물이며, 구현체는 유사한 데이터 구조를 사용할 필요는 없습니다.
구문 문법의 생산은 구분 기호로 하나의 콜론 “: ”만을 사용합니다.
13 부터 16 까지 제시된 구문 문법은
ECMAScript Script 또는 Module 에 대해 허용되는 토큰 시퀀스의 완전한 설명이 아닙니다. 특정
추가 토큰 시퀀스도 허용되는데, 이는 특정 위치(예: 줄 종결자 앞)에 세미콜론만 추가하면 문법에서 설명될 수 있는 시퀀스입니다. 또한, 문법에서 설명된 일부 토큰 시퀀스는
특정 “어색한” 위치에 줄 종결자가 나타나면 허용되지 않습니다.
특정 경우, 모호성을 피하기 위해 구문 문법은 유효한 ECMAScript Script 또는 Module 를 형성하지 않는 토큰 시퀀스도 허용하는 일반화된 생산을 사용합니다. 예를 들어, 객체
리터럴 및 객체 구조 분해 패턴에서 이 기법이 사용됩니다. 이러한 경우, 허용되는 토큰 시퀀스를 더욱 제한하는 보조 문법 이 제공됩니다. 일반적으로
조기 오류 규칙은 특정
문맥에서 "P 는 N 을 포함해야 한다 "라고 명시합니다. 여기서
P 는 일반화된 생산의 파싱 노드 인스턴스이며 N 은 보조 문법의 비단말입니다. 이는 다음을 의미합니다:
P 가 원래 매칭한 토큰 시퀀스를 N 을 목표 기호 로 하여 다시 파싱합니다.
N 이 문법 파라미터를 가지면, P 가 원래 파싱될 때와 동일한 값으로 설정합니다.
토큰 시퀀스가 N 의 단일 인스턴스로 파싱될 수 있고, 토큰이 남지 않으면:
해당 P 에 대해 고유한 N 인스턴스를 "P 가 포함하는
N ”이라고 부릅니다.
N 및 그 파생 생산에 대한 모든 조기 오류 규칙은 P 가 포함하는 N 에도 적용됩니다.
그렇지 않으면(파싱이 실패하면) 조기 문법 오류입니다.
5.1.5 문법 표기법
5.1.5.1 단말 기호
ECMAScript 문법에서 일부 단말 기호는 고정폭 글꼴로 표시됩니다.
이러한 기호는 소스 텍스트에 정확히 작성된 대로 나타나야 합니다. 이 방식으로 지정된 모든 단말 기호 코드 포인트는 기본 라틴 블록의 적절한 Unicode 코드
포인트로 이해되어야 하며, 다른 Unicode 범위의 유사한 코드 포인트와는 다릅니다.
단말 기호의 코드 포인트는 \ UnicodeEscapeSequence 로 표현할 수 없습니다.
단말 기호가 개별 Unicode 코드 포인트인 문법(즉, 렉시컬, 정규식, 숫자 문자열 문법)에서, 생산 내 여러 고정폭 코드 포인트가 연속적으로 나타나는 것은 동일한
시퀀스의 코드 포인트를 각각 독립된 단말 기호로 작성하는 것에 대한 간단한 약어입니다.
예를 들어, 다음 생산:
HexIntegerLiteral
::
0x
HexDigits
는 다음과 같은 약어입니다:
HexIntegerLiteral
::
0
x
HexDigits
반대로, 구문 문법에서는 고정폭 코드 포인트가 연속적으로 나타나면 하나의 단일 단말 기호입니다.
단말 기호는 다음 두 가지 형태도 있습니다:
5.1.5.2 비단말 기호 및 생산
비단말 기호는 이탤릭체 로 표시됩니다. 비단말의 정의(생산이라고도 함)는 정의되는 비단말의 이름 뒤에 하나 이상의 콜론이 붙어 도입됩니다. (콜론의 개수는
해당 생산이 속하는 문법을 나타냅니다.) 비단말의 하나 이상의 대체 오른쪽 부분이 뒤따라 나열됩니다. 예를 들어, 구문 정의는 다음과 같습니다:
WhileStatement
:
while
(
Expression
)
Statement
이 정의는 WhileStatement 비단말이
while 토큰, 이어서 왼쪽 괄호 토큰, 이어서 Expression , 이어서 오른쪽 괄호 토큰, 이어서 Statement 를 나타냄을 의미합니다. Expression 및 Statement 는 각각 비단말입니다. 또 다른 예시로,
구문 정의는 다음과 같습니다:
ArgumentList
:
AssignmentExpression
ArgumentList
,
AssignmentExpression
이 정의는 ArgumentList 가 하나의 AssignmentExpression
또는 ArgumentList 뒤에 쉼표, 그리고
AssignmentExpression 가 올 수 있음을 의미합니다.
이 ArgumentList 정의는 재귀적이며, 자기
자신을 기준으로 정의됩니다. 결과적으로 ArgumentList 는 쉼표로 구분된 임의의
개수의 인수를 포함할 수 있으며, 각 인수 식은 AssignmentExpression 입니다. 이러한 비단말의
재귀적 정의는 흔합니다.
5.1.5.3 선택적 기호
단말 또는 비단말 뒤에 나타날 수 있는 아래첨자 접미사 “opt ”는 선택적 기호임을 나타냅니다. 선택적 기호가 포함된 대안은 실제로 선택적 요소를
생략한 오른쪽과 포함한 오른쪽의 두 가지를 지정합니다. 이는 다음을 의미합니다:
VariableDeclaration
:
BindingIdentifier
Initializer opt
는 다음과 같은 편리한 약어입니다:
VariableDeclaration
:
BindingIdentifier
BindingIdentifier
Initializer
그리고 다음과 같습니다:
ForStatement
:
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
는 다음과 같은 편리한 약어입니다:
ForStatement
:
for
(
LexicalDeclaration
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression opt
)
Statement
이는 다시 다음과 같은 약어입니다:
ForStatement
:
for
(
LexicalDeclaration
;
)
Statement
for
(
LexicalDeclaration
;
Expression
)
Statement
for
(
LexicalDeclaration
Expression
;
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression
)
Statement
즉, 이 예시에서 ForStatement 비단말은 실제로 네 가지
대안 오른쪽을 가집니다.
5.1.5.4 문법 파라미터
생산은 아래첨자 주석 "[parameters] " 형태로 파라미터화될 수 있으며, 이는 생산에서 정의된 비단말 기호의 접미사로 나타날 수 있습니다.
“parameters ”는 하나의 이름 또는 쉼표로 구분된 이름 목록일 수 있습니다. 파라미터화된 생산은 해당 파라미터 이름의 모든 조합에 대한
생산 집합을 나타내는 약어로, 파라미터화된 비단말 기호 뒤에 언더스코어와 함께 붙여집니다. 이는 다음을 의미합니다:
StatementList [Return]
:
ReturnStatement
ExpressionStatement
는 다음과 같은 편리한 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
그리고 다음과 같습니다:
StatementList [Return,
In] :
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
StatementList_In
:
ReturnStatement
ExpressionStatement
StatementList_Return_In
:
ReturnStatement
ExpressionStatement
여러 파라미터는 조합적으로 많은 생산을 생성하며, 이들 모두가 반드시 완전한 문법에서 참조되는 것은 아닙니다.
생산의 오른쪽에 있는 비단말 참조 역시 파라미터화될 수 있습니다. 예를 들어:
StatementList
:
ReturnStatement
ExpressionStatement [+In]
는 다음과 동일합니다:
StatementList
:
ReturnStatement
ExpressionStatement_In
그리고 다음과 같습니다:
StatementList
:
ReturnStatement
ExpressionStatement [~In]
는 다음과 동일합니다:
StatementList
:
ReturnStatement
ExpressionStatement
비단말 참조는 파라미터 목록과 “opt ” 접미사를 모두 가질 수 있습니다. 예를 들어:
VariableDeclaration
:
BindingIdentifier
Initializer [+In] opt
는 다음과 같은 약어입니다:
VariableDeclaration
:
BindingIdentifier
BindingIdentifier
Initializer_In
오른쪽 비단말 참조에 파라미터 이름 앞에 “? ”를 붙이면, 해당 파라미터 값이 현재 생산의 왼쪽 기호 참조에 나타나는 파라미터 이름에 의존함을
의미합니다. 예를 들어:
VariableDeclaration [In]
:
BindingIdentifier
Initializer [?In]
는 다음과 같은 약어입니다:
VariableDeclaration
:
BindingIdentifier
Initializer
VariableDeclaration_In
:
BindingIdentifier
Initializer_In
오른쪽 대안에 “[+parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 생산의 비단말 기호 참조에 사용될 때만 사용할 수 있습니다.
“[~parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 사용되지 않을 때만 사용할 수 있습니다. 이는 다음을 의미합니다:
StatementList [Return]
: [+Return]
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ExpressionStatement
StatementList_Return
:
ReturnStatement
ExpressionStatement
그리고 다음과 같습니다:
StatementList [Return]
: [~Return]
ReturnStatement
ExpressionStatement
는 다음과 같은 약어입니다:
StatementList
:
ReturnStatement
ExpressionStatement
StatementList_Return
:
ExpressionStatement
5.1.5.5 one of
문법 정의에서 콜론 뒤에 “one of ”가 나오면, 다음 줄 또는 줄들에 있는 각 단말 기호가 대안 정의임을 나타냅니다. 예를 들어, ECMAScript의
렉시컬 문법에는 다음과 같은 생산이 있습니다:
NonZeroDigit
:: one of 1
2 3 4 5 6
7 8 9
이는 다음과 같은 간편한 약어입니다:
NonZeroDigit
::
1
2
3
4
5
6
7
8
9
5.1.5.6 [empty]
생산의 오른쪽에 “[empty]”라는 문구가 나타나면, 해당 생산의 오른쪽에 단말 또는 비단말이 없음을 나타냅니다.
5.1.5.7 전방 탐색 제한
생산의 오른쪽에 “[lookahead = seq ]” 문구가 나타나면, 해당 생산은 토큰 시퀀스 seq 가 즉시 뒤따르는 입력 토큰
시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 마찬가지로 “[lookahead ∈ set ]”에서 set 은
유한 하고 비어 있지 않은 토큰
시퀀스 집합일 때, 해당 생산은 집합의 일부 요소가 즉시 뒤따르는 토큰 시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 편의를 위해 집합을 비단말로도 쓸 수
있는데, 이 경우 해당 비단말이 확장될 수 있는 모든 토큰 시퀀스의 집합을 나타냅니다. 만약 비단말이 무한히 많은 토큰 시퀀스로 확장될 수 있다면 이는 편집상 오류로
간주됩니다.
이 조건들은 부정될 수 있습니다. “[lookahead ≠ seq ]”는 seq 가 즉시 뒤따르는 입력 토큰 시퀀스의 접두사가
아닌 경우에만 해당 생산을 사용할 수 있음을 나타내며, “[lookahead ∉ set ]”는 어느 요소도 즉시
뒤따르는 토큰 시퀀스의 접두사가 아닌 경우에만 해당 생산을 사용할 수 있음을 나타냅니다.
예시로, 다음 정의가 주어졌을 때:
DecimalDigit
:: one of 0
1 2 3 4 5
6 7 8 9
DecimalDigits
::
DecimalDigit
DecimalDigits
DecimalDigit
다음과 같은 정의에서:
LookaheadExample
::
n
[lookahead ∉ { 1 , 3 , 5 ,
7 , 9 }]
DecimalDigits
DecimalDigit
[lookahead ∉ DecimalDigit ]
이 정의는 n 문자 뒤에 하나 이상의 십진수 숫자가 오는데, 첫 번째 숫자가 짝수인 경우, 또는 십진수 숫자가 뒤에 다른 십진수 숫자가 오지
않는 경우를 매칭합니다.
이러한 문구가 구문 문법에서 사용될 때는, 즉시 뒤따르는 토큰 시퀀스를 명확하게 식별하는 것이 불가능할 수 있습니다. 이후 토큰을 결정하려면 이후 위치에서 사용할
렉시컬 목표 기호 를 알아야 하기 때문입니다. 따라서 구문 문법에서
이러한 제한이 사용될 때, 토큰 시퀀스 seq 가 전방 탐색 제한에(집합의 일부로 포함되는 경우 포함하여) 나타나고, 사용되는 렉시컬
목표 기호 의 선택에 따라 seq 가 결과 토큰
시퀀스의 접두사가 될 수 있는지 여부가 달라진다면, 이는 편집상 오류로 간주됩니다.
구문 문법의 생산 오른쪽에 “[여기 LineTerminator 없음]”이라는 문구가 나타나면, 해당 생산은
제한된 생산 임을 의미합니다. 즉, 입력 스트림의 지정된 위치에 LineTerminator 가 발생하면 사용할 수 없습니다. 예를 들어, 다음
생산:
ThrowStatement
:
throw
[여기 LineTerminator 없음]
Expression
;
이 생산은 throw 토큰과 Expression 사이에 LineTerminator 가 스크립트에 있으면 사용할 수 없음을 나타냅니다.
제한된 생산에 의해 LineTerminator 의 존재가 금지되지 않는 한, 입력 요소 스트림 내의
연속된 두 토큰 사이에는 임의의 개수의 LineTerminator 가 있어도 스크립트의 구문적 허용성에는 영향을 주지
않습니다.
5.1.5.9 but not
생산의 오른쪽에 “but not ” 문구를 사용하여, 확장 중 특정 경우를 허용하지 않음을 지정할 수 있습니다. 예를 들어, 다음 생산:
Identifier
::
IdentifierName
but not ReservedWord
이 정의는 Identifier 비단말이 IdentifierName 로 대체될 수 있으나,
같은 코드 포인트 시퀀스가 ReservedWord 로도 대체될 수 있다면 허용되지 않음을 의미합니다.
5.1.5.10 설명적 문구
마지막으로, 경우에 따라 모든 대안을 나열하는 것이 비현실적일 때 몇몇 비단말 기호는 산세리프체 설명 문구로 서술됩니다:
SourceCharacter
::
모든 Unicode 코드 포인트
5.2 알고리즘 규칙
명세에서는 종종 번호가 매겨진 목록을 사용하여 알고리즘의 단계를 지정합니다. 이러한 알고리즘은 ECMAScript 언어 구성 요소의 필수 의미를 정확히 명시하는 데 사용됩니다. 이
알고리즘들은 특정 구현 기법의 사용을 암시하려는 의도가 아닙니다. 실제로는 주어진 기능을 구현할 때 더 효율적인 알고리즘이 있을 수 있습니다.
알고리즘은 명시적으로 매개변수화될 수 있으며, 쉼표로 구분된 순서의 별칭 이름 시퀀스를 사용하여, 알고리즘 단계 내에서 해당 위치에 전달된 인수를 참조할 수 있습니다. 선택적
매개변수는 괄호([ , name ])로 둘러싸여 있으며, 알고리즘 단계 내에서는 필수 매개변수와 다르지 않습니다. 나머지 매개변수(rest parameter)는
매개변수 목록의 끝에 ...name 형태로 나타나며, 필수 및 선택적 매개변수 뒤에 제공된 모든 인수를 List 에 담습니다. 추가 인수가 없다면 해당
List 는 비어 있습니다.
알고리즘 단계는 순차적 하위 단계로 세분화될 수 있습니다. 하위 단계는 들여쓰기되며, 자체적으로 추가 하위 단계로 나눌 수 있습니다. 개요 번호 규칙에 따라 첫 번째 하위 단계는
소문자 알파벳, 두 번째 하위 단계는 소문자 로마 숫자가 사용됩니다. 세 단계보다 많으면 네 번째 단계는 숫자 라벨을 사용하며, 예시는 다음과 같습니다:
최상위 단계
하위 단계.
하위 단계.
하위하위 단계.
하위하위하위 단계
하위하위하위하위 단계
하위하위하위하위하위 단계
단계 또는 하위 단계는 “if” 조건문으로 작성되어 그 하위 단계를 조건부로 적용할 수 있습니다. 이 경우, 조건이 참일 때만 하위 단계가 적용됩니다. 단계 또는 하위 단계가
“else”로 시작하면, 같은 수준의 앞선 “if” 조건문의 부정 조건입니다.
단계는 그 하위 단계를 반복적으로 적용한다고 명시할 수 있습니다.
“Assert :”로 시작하는 단계는 알고리즘의 불변 조건을 주장합니다. 이러한 주장은 암묵적인 알고리즘적 불변
조건을 명시적으로 드러내기 위해 사용됩니다. 이러한 주장은 추가적인 의미적 요구사항을 부과하지 않으므로 구현체에서 반드시 검사할 필요는 없습니다. 오로지 알고리즘을 명확히 하기
위해 사용됩니다.
알고리즘 단계에서는 “Let x be someValue ” 형태로 명명된 별칭(alias)을 선언할 수 있습니다. 이 별칭은 참조처럼 동작하여
x 와 someValue 모두 동일한 데이터 기반을 참조하며, 둘 중 하나를 변경하면 모두에게 반영됩니다. 참조와 같은 동작을 피하고 싶다면
“Let x be a copy of someValue ”처럼 오른쪽 값을 복사하도록 명시해야 하며, 이는
someValue 의 얕은 복사본을 생성합니다.
한 번 선언된 별칭은 이후 단계에서 참조할 수 있으며, 별칭 선언 이전의 단계에서는 참조해서는 안 됩니다. 별칭은 “Set x to
someOtherValue ” 형태로 수정할 수 있습니다.
5.2.1 추상 연산
명세의 여러 부분에서 사용될 수 있도록, 일부 알고리즘은 추상 연산 이라 불리며, 이름이 붙고 매개변수화된 함수 형태로 작성되어
다른 알고리즘에서 이름으로 참조될 수 있습니다. 추상 연산은 보통 OperationName(arg1 , arg2 )과 같은 함수 호출
방식으로 참조됩니다. 일부 추상 연산은 클래스와 유사한 명세 추상화의 다형적으로 호출되는 메서드로 취급되기도 합니다. 이러한 메서드형 추상 연산은 일반적으로
someValue .OperationName(arg1 , arg2 )와 같은 메서드 호출 방식으로 참조됩니다.
5.2.2 구문 지향 연산
구문 지향 연산 이란, 하나 이상의 ECMAScript 문법
생산에 연결된 알고리즘으로 구성된 이름 있는 연산입니다. 여러 대안 정의가 있는 생산은 일반적으로 각 대안마다 별도의 알고리즘을 가집니다. 알고리즘이 문법 생산에 연결되면,
해당 대안의 단말 및 비단말 기호를 알고리즘의 매개변수처럼 참조할 수 있습니다. 이 방식에서 비단말 기호는 소스 텍스트를 파싱할 때 실제로 일치한 대안 정의를 참조합니다.
문법 생산이나 그로부터 파생된 파싱
노드 가 일치시킨 소스 텍스트 란, 일치에 참여한 첫 번째 단말부터 마지막 단말까지의 소스 텍스트 부분을 의미합니다.
알고리즘이 생산 대안에 연결되면, 대안은 일반적으로 “[ ]” 문법 주석 없이 표시됩니다. 이러한 주석은 대안의 구문 인식에만 영향을 주며, 연결된 의미에는 영향을 주지
않습니다.
구문 지향 연산은 파싱 노드와 필요하다면 추가 매개변수를 전달하여, 다음 알고리즘의 1 , 3 , 4 단계 규칙을 따라 호출됩니다:
Let status be SyntaxDirectedOperation of
SomeNonTerminal .
Let someParseNode be the parse of some source text.
Perform SyntaxDirectedOperation of
someParseNode .
Perform SyntaxDirectedOperation of
someParseNode with argument "value" .
명시적으로 달리 지정하지 않는 한, 모든 연쇄 생산 은 해당 생산의 왼쪽 비단말에 적용될 수 있는 모든 연산에
대한 암묵적 정의를 가집니다. 암묵적 정의는 동일한 연산을 동일한 매개변수로, 해당 연쇄 생산 의 유일한 오른쪽 비단말에 다시
적용한 뒤 그 결과를 반환합니다. 예를 들어, 어떤 알고리즘이 “Return Evaluation of Block ” 단계를 가진다고 가정하고, 다음과 같은 생산이 있다고 합시다:
Block :
{
StatementList
}
하지만 Evaluation 연산이 해당 생산에 알고리즘을 연결하지 않았다면, Evaluation 연산은
암묵적으로 다음과 같은 연결을 포함합니다:
런타임 의미: Evaluation
Block :
{
StatementList
}
Return Evaluation of StatementList .
5.2.3 런타임 의미
런타임에 호출되어야 할 의미를 명시하는 알고리즘을 런타임 의미 라 합니다. 런타임 의미는 추상 연산 이나 구문 지향 연산 으로
정의됩니다.
5.2.3.1 Completion ( completionRecord )
추상 연산 Completion은 completionRecord (Completion Record )
인자를 받아 Completion Record 를
반환합니다. 이는 Completion Record 가
반환됨을 강조할 때 사용됩니다. 다음 단계를 수행합니다:
Assert :
completionRecord 는 Completion
Record 이다.
completionRecord 를 반환한다.
5.2.3.2 예외 던지기
예외를 던지라고 하는 알고리즘 단계, 예:
TypeError 예외를 던진다.
는 다음과 동일한 의미입니다:
Return ThrowCompletion (새롭게 생성된
TypeError 객체).
5.2.3.3 ReturnIfAbrupt
다음과 같은 알고리즘 단계 혹은 동등한 단계:
ReturnIfAbrupt (argument ).
는 다음과 동일한 의미입니다:
Assert :
argument 는 Completion
Record 이다.
만약 argument 가 abrupt
completion 이면, Completion (argument )를
반환한다.
그렇지 않으면, argument 를 argument .[[Value]] 로 설정한다.
다음과 같은 알고리즘 단계 혹은 동등한 단계:
ReturnIfAbrupt (AbstractOperation()).
는 다음과 동일한 의미입니다:
hygienicTemp 를 AbstractOperation()의 결과로 설정한다.
Assert :
hygienicTemp 는 Completion
Record 이다.
만약 hygienicTemp 가 abrupt
completion 이면, Completion (hygienicTemp )를
반환한다.
그렇지 않으면, hygienicTemp 를 hygienicTemp .[[Value]] 로 설정한다.
hygienicTemp 는 ReturnIfAbrupt와 관련된 단계 내에서만 잠시 사용됩니다.
다음과 같은 알고리즘 단계 혹은 동등한 단계:
result 를 AbstractOperation(ReturnIfAbrupt (argument ))의
결과로 설정한다.
는 다음과 동일한 의미입니다:
Assert :
argument 는 Completion
Record 이다.
만약 argument 가 abrupt
completion 이면, Completion (argument )를
반환한다.
그렇지 않으면, argument 를 argument .[[Value]] 로 설정한다.
result 를 AbstractOperation(argument )의 결과로 설정한다.
5.2.3.4 ReturnIfAbrupt 약어
추상 연산 및
구문 지향 연산
호출 앞에 ?가 붙으면, 결과 Completion
Record 에 ReturnIfAbrupt 를 적용해야 함을 나타냅니다. 예:
? OperationName().
다음 단계와 동일합니다:
ReturnIfAbrupt (OperationName()).
유사하게, 메서드 호출 방식에서는 다음 단계:
? someValue .OperationName().
다음과 동일합니다:
ReturnIfAbrupt (someValue .OperationName()).
유사하게, ! 접두사는 뒤따르는 추상 또는 구문 지향
연산 이 abrupt
completion 을 반환하지 않고, 결과 Completion Record 의
[[Value]] 필드를 연산의 반환 값으로 사용해야 함을 나타냅니다. 예:
Let val be ! OperationName().
다음 단계와 동일합니다:
Let val be OperationName().
Assert :
val 은 normal
completion 이다.
val 을 val .[[Value]] 로 설정한다.
구문 지향
연산 은 런타임 의미 에서 ! 또는
?를 연산 호출 앞에 붙여 이 약어를 사용합니다:
Perform ! SyntaxDirectedOperation of NonTerminal .
5.2.3.5 암묵적 정상 완료
추상 연산 에서
Completion Record 를
반환한다고 선언된 알고리즘과 모든 내장 함수에서, 반환값은 먼저 NormalCompletion 에 전달되고, 그 결과가 실제로 사용됩니다.
이 규칙은 Completion 알고리즘 내부나, 반환값이 해당 단계에서 명확히
Completion Record 로
표시된 경우에는 적용되지 않습니다. 이러한 경우는 다음과 같습니다:
이러한 추상 연산에서 다른 방식으로 Completion
Record 가 반환되면 편집상 오류입니다. 예를 들어, 이러한 추상 연산 내에서,
Return true .
는 다음과 같은 단계와 동일합니다:
Return NormalCompletion (true ).
또는
Let completion be NormalCompletion (true ).
Return Completion (completion ).
또는
Return Completion
Record { [[Type]] :
normal , [[Value]] :
true , [[Target]] :
empty }.
ReturnIfAbrupt 확장 규칙을 통해, 다음 예시는 허용됩니다.
확장된 단계 내에서는 Completion 의 결과가 비정상(abrupt)인 경우 직접 반환되고,
정상(normal)인 경우 언랩 후 암묵적으로 NormalCompletion 이 적용됩니다.
Return ? completion .
다음 예시는 Completion Record 가
해당 단계에서 명시적으로 표시되지 않고 반환되므로 편집상 오류입니다.
Let completion be NormalCompletion (true ).
Return completion .
5.2.4 정적 의미
문맥 자유 문법만으로는 입력 요소 스트림이 평가 가능한 유효한 ECMAScript Script 또는 Module 인지 결정하는 모든 규칙을 표현하기에는 충분하지 않습니다. 어떤 상황에서는
ECMAScript 알고리즘 규칙이나 산문적 요구사항으로 표현되는 추가 규칙이 필요합니다. 이러한 규칙은 항상 문법 생산에 연결되며, 해당 생산의 정적 의미 라 불립니다.
정적 의미 규칙은 이름을 가지며, 보통 알고리즘으로 정의됩니다. 이름 있는 정적 의미 규칙은 문법 생산에 연결되고, 여러 대안 정의가 있는 생산은 각 대안마다 적용 가능한
이름 있는 정적 의미 규칙에 대해 별도의 알고리즘을 가집니다.
정적 의미 규칙의 특수한 종류가 조기 오류 규칙 입니다. 조기 오류 규칙은 특정 문법 생산과
연결된 조기 오류 조건을
정의합니다(17 절 참조). 대부분의
조기 오류 규칙에 대한
Evaluation
호출은 명세 알고리즘 내에서 명시적으로 호출되지 않습니다. 적합한 구현체는 Script 또는 Module 을 최초로 평가하기 전에, 해당 Script 또는 Module 을 파싱하는 데 사용된 모든 생산의 조기 오류 규칙을 검사해야 합니다. 만약 조기 오류 규칙이 위반되면, 해당
Script 또는 Module 은 유효하지 않으며 평가될 수 없습니다.
5.2.5 수학 연산
이 명세에서는 다음과 같은 종류의 수치 값을 참조합니다:
이 명세에서 수치 값은 아래첨자 접미사를 통해 서로 다른 숫자 종류로 구분됩니다. 𝔽 는 Number, ℤ 는 BigInt를 의미합니다.
접미사가 없는 수치 값은 수학적 값 을 의미합니다. 대부분의 수치 값은 10진수로 표기되며, 0x로 시작하는
경우 16진수 값입니다.
일반적으로 명세에서 "the length of y " 또는 "the integer represented by the four hexadecimal digits ..."처럼
숫자 종류를 명시하지 않을 때는 수학적 값 을 의미합니다. Number 또는 BigInt 값은 명시적으로 표시됩니다.
예: "the Number
value for the number of code points in …" 또는 "the BigInt value
for …".
명세에서 정수(integer) 란 별도 명시가 없는 한 수학적 값
중 정수 집합에 속하는 값을
의미합니다. 정수(Number) 란 유한 Number 값 중 수학적
값 이 정수 집합에 속하는 값을 의미합니다.
+, ×, =, ≥ 등의 수치 연산자는 피연산자의 타입에 따라 해당 연산을 의미합니다. 수학적 값 에 적용하면 일반적인 수학 연산을 의미합니다.
확장 수학적 값 에 적용하면 확장 실수에 대한 연산을 의미하며,
결정할 수 없는 형태는 정의되지 않으며 명세에서 사용하면 편집상 오류입니다. Number에 적용하면 IEEE 754-2019 의 관련 연산을 의미합니다.
BigInt에 적용하면 해당 BigInt의 수학적 값 에 대한 일반적인 수학 연산을 의미합니다. 서로 다른 타입의
피연산자(예: Number와 수학적 값 )에 적용된 수치 연산자는 정의되지 않으며, 명세에서 사용하면 편집상
오류입니다.
수학적
값 과 Number 또는 BigInt 간 변환은 항상 명시적으로 이루어집니다. 수학적 값
또는 확장 수학적 값 x 를 Number로 변환하는
것은 "the Number
value for x " 또는 𝔽(x ) 으로 표기하며, 6.1.6.1 에서 정의됩니다.
정수 x 를
BigInt로 변환하는 것은 "the BigInt value for
x " 또는 ℤ(x ) 으로 표기합니다.
Number 또는 BigInt x 를 수학적 값 으로 변환하는 것은 "the mathematical value of x " 또는
ℝ(x ) 으로 표기합니다. mathematical
value of +0 𝔽 와
-0 𝔽 은 수학적 값 0입니다. mathematical
value of 비-유한 값은 정의되지 않습니다. extended mathematical value of x 는 유한 값에서는 mathematical
value of x 와 동일하며, +∞ 𝔽 및
-∞ 𝔽 에는 +∞, -∞이고, NaN 에는 정의되지 않습니다.
수학 함수 abs(x ) 는 x 의
절대값을 반환하며, x < 0이면 -x , 그렇지 않으면
x 자체입니다.
수학 함수 min(x1 , x2 , … ,
xN ) 는 x1 부터 xN 중 가장 작은 값을 반환합니다. max(x1 , x2 , ..., xN ) 는 가장 큰 값을
반환합니다. 이 함수들의 정의역과 치역은 확장 수학적 값 입니다.
표기 “x modulo
y ”(y 는 유한 이며 0이 아니어야 함)은 y 와 부호가 같거나 0인 k 값을
계산하며, abs (k ) < abs (y ) 이고,
x - k = q × y 인 정수 q 가 존재합니다.
“the result of clamping x between
lower and upper ”(x 는 확장
수학적 값 , lower , upper 는 수학적
값 이고 lower ≤ upper )은 x <
lower 면 lower 를, x > upper 면 upper 를, 그렇지
않으면 x 를 반환합니다.
수학 함수 floor(x ) 는
x 보다 크지 않은 가장 큰 정수 (+∞에 가장 가까운)를 반환합니다.
참고
floor (x ) = x -
(x modulo 1) .
수학 함수 truncate(x ) 는
x 의 소수 부분을 제거하여 0에 가까워지도록 반올림합니다. x < 0이면 -floor (-x ) , 그렇지 않으면 floor (x ) 을 반환합니다.
수학 함수 min , max , abs , floor , truncate 는 Number와 BigInt에는 정의되지 않으며,
비-수학적
값 인수가 사용되면 편집상 오류입니다.
구간(interval) 은 하한 a 에서 상한 b 까지의, 같은 숫자
타입의 값을 요소로 가지는 (무한하거나 비어 있을 수 있는) 집합입니다. 각 경계는 포함 또는 배타로 설명됩니다. 다음 네 가지 구간이 있습니다:
구간
a (포함)에서 b (포함)까지, 즉 포함
구간 a 에서 b 까지는 a ≤ x ≤ b 인 같은
타입의 값 x 를 모두 포함합니다.
구간
a (포함)에서 b (배타)까지는 a ≤ x < b 인 값을 모두
포함합니다.
구간
a (배타)에서 b (포함)까지는 a < x ≤ b 인 값을 모두
포함합니다.
구간
a (배타)에서 b (배타)까지는 a < x < b 인 값을
모두 포함합니다.
예를 들어, 1(포함)에서 2(배타)까지의 구간 은 1과 2 사이의 모든 수학적 값 을 포함하며, 1은 포함하고 2는 포함하지
않습니다. 구간 정의를 위해 -0 𝔽 < +0 𝔽 이므로,
예를 들어 하한이 +0 𝔽 인 포함 구간 은
+0 𝔽 는 포함하지만 -0 𝔽 는 포함하지 않습니다.
NaN 은 어떤 구간 에도 포함되지 않습니다.
5.2.6 값 표기법
이 명세에서 ECMAScript 언어 값 은 굵은
글씨 로 표시됩니다. 예시로 null , true ,
"hello" 등이 있습니다. 이는 ECMAScript 소스 텍스트 (예:
Function.prototype.apply 또는 let n = 42;)와 구별됩니다.
5.2.7 동일성(Identity)
이 명세에서는 명세 값과 ECMAScript 언어 값 모두 동등성 비교를 수행합니다.
비교 시 값은 두 범주로 나뉩니다. 동일성 없는 값(value without identity) 은 모든 고유 특성이 같으면 서로 동등합니다— 예: 정수 의 크기, 시퀀스의 길이 등. 동일성 없는
값은 특성을 완전히 기술하는 것만으로도 나타낼 수 있습니다. 반면, 동일성 있는
값(value with identity) 은 고유하며 자기 자신과만 동등합니다. 동일성 있는 값은 동일성 없는 값과 같지만 identity 라
불리는 추가적이고 유일하며 변하지 않는 특성을 가집니다. 기존 동일성 있는 값에 대한 참조는 단순히 특성을 기술하는 것만으로 생성할 수 없으며, 반드시 명시적으로 전달되어야
합니다. 동일성 있는 값 중 일부는 변경 가능(mutable)하며, 특성(동일성 제외)이 변경될 수 있어 모든 참조자에게 새로운 특성이 관찰됩니다. 동일성 없는 값은 동일성
있는 값과 절대 동등하지 않습니다.
명세 관점에서 “is”는 두 값을 동등성 비교하는 데 사용되며(예: “If bool is true , then ...”),
“contains”는 리스트 내에서 동등성 비교로 값을 찾는 데 사용됩니다(예: "If list contains a Record r such
that r .[[Foo]] is true , then ...").
명세 동일성 은 이러한 비교의 결과를 결정하며, 이 명세에서 공리적으로 정의됩니다.
ECMAScript 언어 관점에서는, 언어 값은 SameValue 추상 연산 및 그에 의해 전이적으로 호출되는 추상 연산 으로 비교됩니다. 이 비교
추상 연산 알고리즘이
ECMAScript 언어 값 의 언어 동일성 을
결정합니다.
명세 값에 대해, 동일성 없는 값의 예는 수학적 값 , 확장
수학적 값 , ECMAScript 소스 텍스트 , 서로게이트 페어 ,
Directive
Prologues 등, UTF-16 코드 유닛, Unicode 코드 포인트, enum , 추상 연산 및 구문 지향 연산 ,
host hook , 순서쌍
등입니다. 명세 동일성을 가지는 값의 예는 Record (Property Descriptor ,
PrivateElement 등 포함),
파싱
노드 , List ,
Set 및 Relation , Abstract
Closure , Data Block , Private Name , 실행
컨텍스트 , 실행 컨텍스트 스택 , agent signifier , WaiterList
Record 등입니다.
명세 동일성은 ECMAScript 언어 값 중 Symbol.for 로 생성된
Symbol 값을 제외하고는 모두 언어 동일성과 일치합니다. 명세 동일성도, 언어 동일성도 가지지 않는 ECMAScript 언어 값은 undefined ,
null ,
Boolean , String , Number , BigInt 입니다. 명세 동일성과 언어
동일성을 모두 가지는 ECMAScript 언어 값은 Symbol (Symbol.for 로 생성된
것은 제외)과 Object 입니다. Symbol.for 로 생성된 Symbol 값은 명세 동일성은 있으나
언어 동일성은 없습니다.
6 ECMAScript 데이터 타입과 값
이 명세의 알고리즘은 각 값이 관련 타입을 가진 값을 다룹니다. 가능한 값 타입은 바로 이 절에서 정의된 타입들입니다. 타입은 ECMAScript 언어 타입 과 명세 타입으로 더 분류됩니다.
6.1 ECMAScript 언어 타입
ECMAScript 언어 타입 은 ECMAScript 프로그래머가
ECMAScript 언어를 사용하여 직접 다루는 값에 해당합니다.
ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object가 있습니다.
ECMAScript 언어 값 은 ECMAScript 언어 타입으로
특징지어지는 값입니다.
6.1.1 Undefined 타입
Undefined 타입은 undefined 라 불리는 정확히 하나의 값을 가집니다. 값이 할당되지 않은 변수는
undefined 값을 가집니다.
6.1.2 Null 타입
Null 타입은 null 이라 불리는 정확히 하나의 값을 가집니다.
6.1.3 Boolean 타입
Boolean 타입 은
true 와 false 라 불리는 두 값을 가지는 논리적 개체를 나타냅니다.
6.1.4 String 타입
String 타입 은 253 - 1개의
요소까지 0개 이상의 16비트 부호 없는 정수 값(“요소”)의 모든 순서 있는 시퀀스의 집합입니다. String 타입은 일반적으로 실행 중인
ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 처리됩니다. 각 요소는 시퀀스 내에서
위치를 차지합니다. 이 위치는 0 이상의 정수 로 인덱싱됩니다. 첫 번째 요소(있다면)는 인덱스 0에, 그 다음 요소는 인덱스 1에, 이런 식으로
이어집니다. String의 길이는 그 안의 요소(즉, 16비트 값) 개수입니다. 빈 문자열은 길이가 0이며 요소를 포함하지 않습니다.
String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 하나의 UTF-16 코드 유닛으로
처리합니다. 하지만 ECMAScript는 이러한 코드 유닛의 값이나 관계를 제한하지 않으므로, String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 추가
해석하는 연산은 잘못된 서브시퀀스를 고려해야 합니다. 그러한 연산은 다음 규칙에 따라 0xD800부터 0xDBFF까지의 포함
구간 에 있는 코드 유닛(유니코드 표준에서 선행 서러게이트 , 더 공식적으로는 고서러게이트 코드
유닛 )과 0xDC00부터 0xDFFF까지의 포함 구간 에 있는 코드 유닛(후행 서러게이트 , 더 공식적으로는 저서러게이트 코드
유닛 )을 특별히 처리합니다:
String.prototype.normalize 함수(22.1.3.15 )는 String 값을
명시적으로 정규화하는 데 사용할 수 있습니다. String.prototype.localeCompare(22.1.3.12 )는 내부적으로 String 값을
정규화하지만, 그 외 연산은 문자열을 암묵적으로 정규화하지 않습니다. 연산 결과는 달리 명시되지 않는 한, 언어 또는 로케일에 민감하지 않습니다.
참고
이 설계의 근거는 문자열 구현을 최대한 단순하고 빠르게 유지하기 위함이었습니다. ECMAScript 소스 텍스트 가 정규형
C(Normalized Form C)라면, 문자열 리터럴도 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화됨이 보장됩니다.
이 명세에서 “A , B , ...의 문자열
연결(string-concatenation) ”(각 인자는 String 값, 코드 유닛, 코드 유닛 시퀀스임)은 각 인자의 코드 유닛(순서대로)을
이어붙인(순서대로) 코드 유닛 시퀀스로 구성된 String 값을 의미합니다.
“S 의 inclusiveStart 에서 exclusiveEnd 까지의 부분 문자열(substring) ”(S 는 String 값 또는 코드 유닛 시퀀스,
inclusiveStart 와 exclusiveEnd 는 정수 )는 S 의 인덱스 inclusiveStart 에서 시작해
exclusiveEnd 바로 앞까지의 연속된 코드 유닛으로 구성된 String 값을 의미합니다(만약 inclusiveStart =
exclusiveEnd 이면 빈 문자열). “to” 접미사가 생략되면 S 의 길이가 exclusiveEnd 값으로
사용됩니다.
“ASCII 단어 문자 ”는 다음 String 값을 의미합니다. 이 값은 유니코드
기본 라틴 블록 내의 모든 문자와 숫자 및 U+005F(LOW LINE)만으로 구성됩니다:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" .
역사적 이유로 여러 알고리즘에서 의미가 있습니다.
6.1.4.1 StringIndexOf ( string ,
searchValue , fromIndex )
추상 연산 StringIndexOf는 string (String), searchValue (String),
fromIndex (0 이상의 정수 )를 인자로 받고, 0 이상의 정수 또는 not-found 를
반환합니다. 다음 단계를 수행합니다:
len 을 string 의 길이로 설정한다.
searchValue 가 빈 문자열이고 fromIndex ≤ len 이면
fromIndex 를 반환한다.
searchLen 을 searchValue 의 길이로 설정한다.
fromIndex ≤ i ≤ len - searchLen 인 모든
정수
i 에 대해 오름차순으로 다음을 수행한다:
candidate 를 string 의 i 에서 i +
searchLen 까지의 부분 문자열 로 설정한다.
candidate 가 searchValue 와 같으면 i 를 반환한다.
not-found 를 반환한다.
참고 1
searchValue 가 빈 문자열이고 fromIndex ≤ string 의 길이인 경우, 이
알고리즘은 fromIndex 를 반환합니다. 빈 문자열은 문자열 내의 모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로
간주됩니다.
참고 2
이 알고리즘은 fromIndex + searchValue 의 길이가 string 의 길이를
초과하면 항상 not-found 를 반환합니다.
6.1.4.2 StringLastIndexOf ( string ,
searchValue , fromIndex )
추상 연산 StringLastIndexOf는 string (String), searchValue (String),
fromIndex (0 이상의 정수 )를 인자로 받고, 0 이상의 정수 또는 not-found 를
반환합니다. 다음 단계를 수행합니다:
len 을 string 의 길이로 설정한다.
searchLen 을 searchValue 의 길이로 설정한다.
Assert :
fromIndex + searchLen ≤ len .
0 ≤ i ≤ fromIndex 인 모든 정수 i 에 대해 내림차순으로 다음을
수행한다:
candidate 를 string 의 i 에서 i +
searchLen 까지의 부분 문자열 로 설정한다.
candidate 가 searchValue 와 같으면 i 를 반환한다.
not-found 를 반환한다.
참고
searchValue 가 빈 문자열인 경우, 이 알고리즘은 fromIndex 를 반환합니다. 빈 문자열은 문자열 내의
모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로 간주됩니다.
6.1.5 심볼(Symbol) 타입
심볼 타입 은
객체 속성의 키로 사용할 수 있는 모든 비문자열 값의 집합입니다 (6.1.7 ).
각 심볼은 고유하며 변경할 수 없습니다.
각 심볼은 변경할 수 없는 [[Description]] 내부 슬롯을 가지며, 그 값은 문자열이거나
undefined 입니다.
6.1.5.1 잘 알려진 심볼(Well-Known Symbols)
잘 알려진 심볼은 이 명세의 알고리즘에서 명시적으로 참조되는 내장 Symbol 값입니다. 일반적으로 명세 알고리즘의 확장 포인트로 사용되는 프로퍼티의 키로 사용됩니다.
별도 명시가 없는 한, 잘 알려진 심볼 값은 모든 realm (9.3 )에서 공유됩니다.
이 명세에서는 잘 알려진 심볼을 표준 내장 표기법(intrinsic notation) 을
사용하여 참조하며, 내장은 표 1 에 나열된 값 중 하나입니다.
참고
이전 판 명세에서는 @@name 형태의 표기를 사용했으나, 현재 판에서는
%Symbol.name%를 사용합니다. 특히 다음 이름이 사용되었습니다: @@asyncIterator, @@hasInstance,
@@isConcatSpreadable, @@iterator , @@match, @@matchAll,
@@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, 그리고
@@unscopables.
표 1: 잘 알려진 심볼(Well-known Symbols)
명세 이름
[[Description]]
값 및 목적
%Symbol.asyncIterator%
"Symbol.asyncIterator"
객체의 기본 비동기 이터레이터(async
iterator) 를 반환하는 메서드입니다.
for-await-of 문의 의미론에서 호출됩니다.
%Symbol.hasInstance%
"Symbol.hasInstance"
생성자(constructor) 객체가 특정 객체를
자신의 인스턴스로 인식하는지 결정하는 메서드입니다. instanceof 연산자의 의미론에서 호출됩니다.
%Symbol.isConcatSpreadable%
"Symbol.isConcatSpreadable"
true일 경우 Array.prototype.concat 에
의해 객체가 배열 요소로 펼쳐져 평탄화(flatten)되어야 함을 나타내는 불리언 프로퍼티입니다.
%Symbol.iterator%
"Symbol.iterator"
객체의 기본 이터레이터(iterator) 를
반환하는 메서드입니다. for-of 문의 의미론에서 호출됩니다.
%Symbol.match%
"Symbol.match"
정규식이 문자열과 매칭되는지 확인하는 정규식 메서드입니다. String.prototype.match
메서드에서 호출됩니다.
%Symbol.matchAll%
"Symbol.matchAll"
정규식이 문자열 전체에서 매칭되는 부분을 이터레이터(iterator) 로
반환하는 정규식 메서드입니다. String.prototype.matchAll
메서드에서 호출됩니다.
%Symbol.replace%
"Symbol.replace"
문자열에서 매칭된 부분 문자열을 대체하는 정규식 메서드입니다. String.prototype.replace
메서드에서 호출됩니다.
%Symbol.search%
"Symbol.search"
문자열 내에서 정규식이 매칭되는 인덱스를 반환하는 정규식 메서드입니다. String.prototype.search
메서드에서 호출됩니다.
%Symbol.species%
"Symbol.species"
파생 객체를 생성하는 데 사용되는 생성자 함수 인 함수 값 프로퍼티입니다.
%Symbol.split%
"Symbol.split"
정규식과 매칭되는 인덱스에서 문자열을 분할하는 정규식 메서드입니다. String.prototype.split
메서드에서 호출됩니다.
%Symbol.toPrimitive%
"Symbol.toPrimitive"
객체를 대응하는 원시값(primitive value)으로 변환하는 메서드입니다. ToPrimitive 추상 연산에서
호출됩니다.
%Symbol.toStringTag%
"Symbol.toStringTag"
객체의 기본 문자열 설명을 생성할 때 사용하는 문자열 값 프로퍼티입니다. 내장 메서드 Object.prototype.toString 에서
접근됩니다.
%Symbol.unscopables%
"Symbol.unscopables"
자신의 프로퍼티 이름 및 상속된 프로퍼티 이름이 관련 객체의 with 환경 바인딩에서 제외되는 프로퍼티
이름인 객체 값 프로퍼티입니다.
6.1.6 숫자 타입
ECMAScript에는 두 가지 내장 숫자 타입이 있습니다: Number와 BigInt. 아래 추상 연산 들은 이러한 숫자 타입에
대해 정의되어 있습니다. "결과" 열에는 반환 타입과, 일부 연산 호출 시 비정상 완료(abrupt
completion) 가 반환될 수 있는지 여부가 표시됩니다.
표 2: 숫자 타입 연산
연산(Operation)
예시 소스(Example source)
Evaluation 의미론에서 호출됨
결과(Result)
Number::unaryMinus
-x
단항 -
연산자
Number
BigInt::unaryMinus
BigInt
Number::bitwiseNOT
~x
비트 NOT 연산자
(~)
Number
BigInt::bitwiseNOT
BigInt
Number::exponentiate
x ** y
거듭제곱 연산자
및 Math.pow ( base , exponent
)
Number
BigInt::exponentiate
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::multiply
x * y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::multiply
BigInt
Number::divide
x / y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::divide
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::remainder
x % y
곱셈 연산자(Multiplicative
Operators)
Number
BigInt::remainder
BigInt를 포함하는 정상
완료(normal completion) 또는 예외 완료(throw
completion)
Number::add
x ++
++ x
x + y
후위 증가 연산자(Postfix Increment
Operator) ,
전위 증가 연산자(Prefix Increment
Operator) ,
더하기 연산자(+) (The Addition
Operator)
Number
BigInt::add
BigInt
Number::subtract
x --
-- x
x - y
후위 감소 연산자(Postfix Decrement
Operator) ,
전위 감소 연산자(Prefix Decrement
Operator) ,
빼기 연산자(-) (The Subtraction
Operator)
Number
BigInt::subtract
BigInt
Number::leftShift
x << y
왼쪽 시프트 연산자(<<) (The Left Shift
Operator)
Number
BigInt::leftShift
BigInt
Number::signedRightShift
x >> y
부호 있는 오른쪽 시프트 연산자(>>)
(The Signed Right Shift Operator)
Number
BigInt::signedRightShift
BigInt
Number::unsignedRightShift
x >>> y
부호 없는 오른쪽 시프트
연산자(>>>) (The Unsigned Right Shift Operator)
Number
BigInt::unsignedRightShift
예외 완료(throw
completion)
Number::lessThan
x < y
x > y
x <= y
x >= y
관계 연산자(Relational
Operators) ,
IsLessThan ( x , y ,
LeftFirst )
Boolean 또는 undefined (정렬되지 않은 입력)
BigInt::lessThan
Boolean
Number::equal
x == y
x != y
x === y
x !== y
동등 연산자(Equality
Operators) ,
IsStrictlyEqual ( x ,
y )
Boolean
BigInt::equal
Number::sameValue
Object.is(x, y)
객체 내부 메서드,
SameValue ( x , y
) 를 통해 정확한 값 비교
Boolean
Number::sameValueZero
[x].includes(y)
SameValueZero ( x , y
) 를 통해, +0 𝔽 와
-0 𝔽 의 차이를 무시하고 값 비교 (Array, Map, Set 메서드 등)
Boolean
Number::bitwiseAND
x & y
이진 비트 연산자(Binary Bitwise
Operators)
Number
BigInt::bitwiseAND
BigInt
Number::bitwiseXOR
x ^ y
Number
BigInt::bitwiseXOR
BigInt
Number::bitwiseOR
x | y
Number
BigInt::bitwiseOR
BigInt
Number::toString
String(x)
다양한 표현식 및 내장 함수에서, ToString ( argument
) 을 통해 호출됨
String
BigInt::toString
숫자 타입은 일반적으로 정밀도 손실이나 잘림(truncation) 없이 변환할 수 없기 때문에, ECMAScript 언어에서는 이러한 타입 간에 암묵적인 변환을 제공하지
않습니다. 프로그래머는 다른 타입을 요구하는 함수를 호출할 때 Number 또는 BigInt 함수를 명시적으로 호출하여 타입을
변환해야 합니다.
참고
ECMAScript의 초판 및 이후 판에서는 일부 연산자에 대해 정밀도 손실이나 잘림(truncate) 이 발생할 수 있는 암묵적 숫자 변환을 제공했습니다.
이러한 레거시 암묵 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않습니다. 이는 프로그래머의 실수 가능성을 줄이고, 미래 판에서는 일반화된
값 타입(value types) 도입의 여지를 남기기 위함입니다.
6.1.6.1 Number 타입
Number 타입 은 정확히
18,437,736,874,454,810,627개(즉, 264 - 253 +
3 ) 값을 가지며, IEEE 754-2019 에서 지정된 IEEE 배정밀도
부동소수점(binary64) 값을 나타냅니다. 단, IEEE 표준의 9,007,199,254,740,990개(즉, 253 - 2 ) NaN 값은 ECMAScript에서는 하나의 특별한
NaN 값으로 표현됩니다. (NaN 값은 프로그램 표현식 NaN으로
생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은 구현
정의(implementation-defined) 입니다. ECMAScript 코드에서는 모든
NaN 값은 서로 구별되지 않습니다.
참고
Number 값이 ArrayBuffer(25.1 )나
SharedArrayBuffer(25.2 )에 저장된 후 관찰되는 비트
패턴은 ECMAScript 구현에서 사용하는 Number 값의 내부 표현과 반드시 같지 않을 수 있습니다.
그 외에도 양의 무한대(positive Infinity) 와 음의 무한대(negative
Infinity) 라는 두 개의 특별한 값이 있습니다. 간결하게 각각 +∞ 𝔽 와
-∞ 𝔽 로도 설명합니다. (이 두 무한대 Number 값은 +Infinity(또는
Infinity)와 -Infinity 표현식으로 생성됩니다.)
나머지 18,437,736,874,454,810,624개(즉, 264 -
253 ) 값은 유한(finite) 숫자라 불립니다. 이
중 절반은 양수, 절반은 음수입니다. 모든 유한 양의 Number 값에는 동일한 크기의 음수 값이 대응됩니다.
양의 0(positive zero )와 음의 0(negative zero )도 있습니다. 간결하게 각각
+0 𝔽 와 -0 𝔽 로 설명합니다. (이 두 0 값은
+0(또는 0)과 -0 표현식으로 생성됩니다.)
18,437,736,874,454,810,622개(즉, 264 - 253 -
2 ) 유한
0이 아닌 값은 두 가지 종류가 있습니다:
18,428,729,675,200,069,632개(즉, 264 -
254 )는 정규화(normalized)되어 있으며, 다음과 같은 형태를 가집니다:
s × m × 2e
여기서 s 는 1 또는 -1, m 은 정수 이며 구간(interval) [252 , 253 )에 속하고,
e 는 정수 이며 포함 구간 [-1074, 971]에 속합니다.
나머지 9,007,199,254,740,990개(즉, 253 - 2 ) 값은
비정규화(denormalized)되어 있으며, 다음과 같은 형태를 가집니다:
s × m × 2e
여기서 s 는 1 또는 -1, m 은 정수 이며 구간(interval) (0, 252 )에 속하고, e 는
-1074입니다.
크기가 253 이하인 모든 양의 및 음의 정수 는 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서
+0 𝔽 와 -0 𝔽 두 가지로 표현됩니다.
유한 숫자가 0이 아니고 위의 두
형태 중 정수
m 이 홀수이면 홀수 시그니피컨드(odd significand) 를 가지며, 그렇지 않으면 짝수 시그니피컨드(even
significand) 를 가집니다.
이 명세에서 “the Number value for x ”라는 문구에서 x 가
정확한 실수(π와 같은 무리수 포함)를 나타낼 때, 다음 방식으로 Number 값을 선택함을 의미합니다. Number 타입의 모든 유한 값 집합에서
-0 𝔽 을 제거하고, Number 타입으로 표현할 수 없는 두 값을 추가합니다:
21024 (+1 × 253 × 2971 )와
-21024 (-1 ×
253 × 2971 ). 이 집합에서 x 에 가장 가까운 값을 선택합니다. 두 값이
동일하게 가까울 경우, 짝수 시그니피컨드를 가진 값을 선택합니다. 이때 두 추가 값 21024 와 -21024 은 짝수 시그니피컨드를 가진 것으로 간주합니다. 마지막으로,
21024 가 선택되면 +∞ 𝔽 로, -21024 가 선택되면 -∞ 𝔽 로,
+0 𝔽 가 선택되면 x < 0일 때만
-0 𝔽 로 바꿉니다. 그 외의 경우 선택한 값을 그대로 사용합니다. 그 결과가 Number value
for x 입니다. (이 절차는 IEEE 754-2019 의 roundTiesToEven
모드와 정확히 일치합니다.)
Number value
for +∞는 +∞ 𝔽 이고, Number value
for -∞는 -∞ 𝔽 입니다.
일부 ECMAScript 연산자는 정수 의 특정 범위(예: 포함 구간 -231 부터 231 -
1 까지, 또는 포함 구간 0부터 216 - 1 까지)만 다룹니다. 이러한 연산자는 Number 타입의 모든 값을 허용하지만,
우선 해당 값을 기대하는 범위의 정수 값으로 변환합니다. 숫자 변환 연산에 대한 설명은 7.1 를 참조하세요.
6.1.6.1.1 Number::unaryMinus ( x )
추상 연산 Number::unaryMinus는 인자 x (Number)를 받고 Number를 반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이면 NaN 을 반환한다.
x 의 부호를 반전한 값을 반환한다. 즉, 크기는 같지만 부호가 반대인 Number를 계산한다.
6.1.6.1.2 Number::bitwiseNOT ( x )
추상 연산 Number::bitwiseNOT는 인자 x (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음
단계를 수행합니다:
oldValue 를 ! ToInt32 (x )로 설정한다.
oldValue 의 비트 보수를 반환한다. 결과의 수학적 값 은 32비트
2의 보수 비트열로 정확히 표현된다.
6.1.6.1.3 Number::exponentiate ( base ,
exponent )
추상 연산 Number::exponentiate는 인자 base (Number), exponent (Number)를 받고
Number를 반환합니다. base 를 exponent 거듭제곱한 결과를 나타내는 구현 근사값 을 반환합니다. 호출 시 다음 단계를
수행합니다:
exponent 가 NaN 이면 NaN 을 반환한다.
exponent 가 +0 𝔽 또는
-0 𝔽 이면 1 𝔽 을 반환한다.
base 가 NaN 이면 NaN 을 반환한다.
base 가 +∞ 𝔽 이면
exponent > +0 𝔽 이면
+∞ 𝔽 을 반환하고, 아니면
+0 𝔽 을 반환한다.
base 가 -∞ 𝔽 이면
exponent > +0 𝔽 이면
exponent 가 홀수 정수(Number) 이면
-∞ 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
그 외
exponent 가 홀수 정수(Number) 이면
-0 𝔽 을 반환, 아니면
+0 𝔽 을 반환한다.
base 가 +0 𝔽 이면
exponent > +0 𝔽 이면
+0 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
base 가 -0 𝔽 이면
exponent > +0 𝔽 이면
exponent 가 홀수 정수(Number) 이면
-0 𝔽 을 반환, 아니면
+0 𝔽 을 반환한다.
그 외
exponent 가 홀수 정수(Number) 이면
-∞ 𝔽 을 반환, 아니면
+∞ 𝔽 을 반환한다.
Assert :
base 는 유한(finite) 이며
+0 𝔽 또는 -0 𝔽 이 아니다.
exponent 가 +∞ 𝔽 이면
abs (ℝ (base )) >
1이면 +∞ 𝔽 반환
abs (ℝ (base )) = 1이면
NaN 반환
abs (ℝ (base )) <
1이면 +0 𝔽 반환
exponent 가 -∞ 𝔽 이면
abs (ℝ (base )) >
1이면 +0 𝔽 반환
abs (ℝ (base )) = 1이면
NaN 반환
abs (ℝ (base )) <
1이면 +∞ 𝔽 반환
Assert :
exponent 는 유한(finite) 이며
+0 𝔽 또는 -0 𝔽 이 아니다.
base < -0 𝔽 이고 exponent 가
정수(Number) 가 아니면
NaN 반환
구현 근사값 Number 값을
반환하며, 이는 ℝ (base )를 ℝ (exponent ) 거듭제곱한 값이다.
참고
base 가 1 𝔽 또는
-1 𝔽 이고 exponent 가
+∞ 𝔽 또는 -∞ 𝔽 인 경우, 또는
base 가 1 𝔽 이고 exponent 가
NaN 인 경우의 base ** exponent
결과는 IEEE 754-2019 와 다릅니다. ECMAScript
초판은 이 연산에서 NaN 을 반환했지만, 이후 IEEE 754에서는
1 𝔽 을 명시합니다. 호환성 유지를 위해 ECMAScript의 역사적 동작을 따릅니다.
6.1.6.1.4 Number::multiply ( x , y )
추상 연산 Number::multiply는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 곱셈을 수행하여 x 와 y 의
곱을 생성합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면
y 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
y > +0 𝔽 이면 x 반환
-x 반환
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면
x 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
x > +0 𝔽 이면 y 반환
-y 반환
x 가 -0 𝔽 이면
y 가 -0 𝔽 이거나 y <
-0 𝔽 이면 +0 𝔽
반환
그 외에는 -0 𝔽 반환
y 가 -0 𝔽 이면
x < -0 𝔽 이면
+0 𝔽 반환
그 외에는 -0 𝔽 반환
𝔽 (ℝ (x ) ×
ℝ (y ))
반환
참고
유한(finite) 정밀 곱셈은 교환법칙은 성립하지만, 항상 결합법칙이
성립하는 것은 아닙니다.
6.1.6.1.5 Number::divide ( x , y )
추상 연산 Number::divide는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 나눗셈을 수행하며, x 를
피제수(dividend), y 를 제수(divisor)로 하여 몫을 생성합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면 NaN 반환
y 가 +0 𝔽 또는 y >
+0 𝔽 이면 x 반환
-x 반환
y 가 +∞ 𝔽 이면
x 가 +0 𝔽 또는 x >
+0 𝔽 이면 +0 𝔽
반환, 아니면 -0 𝔽 반환
y 가 -∞ 𝔽 이면
x 가 +0 𝔽 또는 x >
+0 𝔽 이면 -0 𝔽
반환, 아니면 +0 𝔽 반환
x 가 +0 𝔽 또는
-0 𝔽 이면
y 가 +0 𝔽 또는
-0 𝔽 이면 NaN 반환
y > +0 𝔽 이면 x 반환
-x 반환
y 가 +0 𝔽 이면
x > +0 𝔽 이면
+∞ 𝔽 반환, 아니면
-∞ 𝔽 반환
y 가 -0 𝔽 이면
x > +0 𝔽 이면
-∞ 𝔽 반환, 아니면
+∞ 𝔽 반환
𝔽 (ℝ (x ) /
ℝ (y ))
반환
6.1.6.1.6 Number::remainder ( n , d )
추상 연산 Number::remainder는 인자 n (Number), d (Number)를 받고 Number를 반환합니다.
n 을 피제수(dividend), d 를 제수(divisor)로 하는 암시적 나눗셈에서의 나머지를 구합니다. 호출 시 다음
단계를 수행합니다:
n 이 NaN 이거나 d 가 NaN 이면
NaN 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면 NaN 을 반환한다.
d 이 +∞ 𝔽 또는
-∞ 𝔽 이면 n 을 반환한다.
d 이 +0 𝔽 또는
-0 𝔽 이면 NaN 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면 n 을 반환한다.
Assert :
n 과 d 는 유한 이며 0이 아니다.
quotient 를 ℝ (n ) / ℝ (d )로 설정한다.
q 를 truncate (quotient )로 설정한다.
r 를 ℝ (n ) - (ℝ (d ) × q )로
설정한다.
r = 0이고 n < -0 𝔽 이면
-0 𝔽 을 반환한다.
𝔽 (r )을 반환한다.
참고 1
C와 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.
참고 2
% 연산자로 계산된 부동소수점 나머지 연산 결과는 IEEE 754-2019 에서
정의한 "나머지(remainder)" 연산과 동일하지 않습니다. IEEE의 "remainder" 연산은 잘림이 아닌 반올림 나눗셈에서의 나머지를
계산하므로, 일반적인 정수 나머지 연산자와는 다릅니다. ECMAScript에서는 부동소수점
% 연산이 Java 정수 나머지 연산자와 유사하게 동작하도록 정의되어
있으며, 이는 C 표준 라이브러리의 fmod 함수와 비교할 수 있습니다.
6.1.6.1.7 Number::add ( x , y )
추상 연산 Number::add는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
IEEE
754-2019 배정밀도 이진 산술 규칙에 따라 덧셈을 수행하여 인자의 합을 생성합니다. 호출 시 다음 단계를
수행합니다:
x 가 NaN 이거나 y 가 NaN 이면
NaN 반환
x 가 +∞ 𝔽 이고 y 가
-∞ 𝔽 이면 NaN 반환
x 가 -∞ 𝔽 이고 y 가
+∞ 𝔽 이면 NaN 반환
x 가 +∞ 𝔽 또는
-∞ 𝔽 이면 x 반환
y 가 +∞ 𝔽 또는
-∞ 𝔽 이면 y 반환
Assert :
x 와 y 는 모두 유한 이다.
x 가 -0 𝔽 이고 y 가
-0 𝔽 이면 -0 𝔽 반환
𝔽 (ℝ (x ) +
ℝ (y ))
반환
참고
유한 정밀
덧셈은 교환법칙은 성립하지만, 항상 결합법칙이 성립하는 것은 아닙니다.
6.1.6.1.8 Number::subtract ( x , y )
추상 연산 Number::subtract는 인자 x (Number), y (Number)를 받고 Number를 반환합니다.
뺄셈을 수행하여 피감수(minuend) x 와 감수(subtrahend) y 의 차를 생성합니다. 호출 시 다음 단계를
수행합니다:
Number::add (x ,
Number::unaryMinus (y ))를
반환한다.
참고
언제나 x - y는 x + (-y)와 동일한 결과를 생성합니다.
6.1.6.1.9 Number::leftShift ( x , y )
추상 연산 Number::leftShift는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 왼쪽 시프트한 결과를 반환한다. 결과의 수학적 값 은 32비트 2의 보수 비트열로 정확히
표현된다.
6.1.6.1.10 Number::signedRightShift ( x ,
y )
추상 연산 Number::signedRightShift는 인자 x (Number), y (Number)를 받고
정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 부호 확장(right shift with sign
extension) 하여 오른쪽 시프트한 결과를 반환한다. 최상위 비트가 전파된다. 결과의 수학적 값 은 32비트 2의 보수 비트열로 정확히
표현된다.
6.1.6.1.11 Number::unsignedRightShift ( x ,
y )
추상 연산 Number::unsignedRightShift는 인자 x (Number), y (Number)를 받고
정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToUint32 (x )로 설정한다.
rNum 을 ! ToUint32 (y )로 설정한다.
shiftCount 를 ℝ (rNum ) modulo 32로 설정한다.
lNum 을 shiftCount 비트만큼 0으로 채우며 오른쪽 시프트한 결과를 반환한다. 비워진 비트는
0으로 채워진다. 결과의 수학적 값 은 32비트 부호 없는 비트열로 정확히
표현된다.
6.1.6.1.12 Number::lessThan ( x , y )
추상 연산 Number::lessThan는 인자 x (Number), y (Number)를 받고 Boolean 또는
undefined 를 반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이면 undefined 반환
y 가 NaN 이면 undefined 반환
x 가 y 이면 false 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 false 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 false 반환
x 가 +∞ 𝔽 이면 false 반환
y 가 +∞ 𝔽 이면 true 반환
y 가 -∞ 𝔽 이면 false 반환
x 가 -∞ 𝔽 이면 true 반환
Assert :
x 와 y 는 유한 이다.
ℝ (x )
< ℝ (y )이면 true 반환,
아니면 false 반환
6.1.6.1.13 Number::equal ( x , y )
추상 연산 Number::equal는 인자 x (Number), y (Number)를 받고 Boolean을 반환합니다. 호출
시 다음 단계를 수행합니다:
x 가 NaN 이면 false 반환
y 가 NaN 이면 false 반환
x 가 y 이면 true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 true 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 true 반환
false 반환
6.1.6.1.14 Number::sameValue ( x , y )
추상 연산 Number::sameValue는 인자 x (Number), y (Number)를 받고 Boolean을
반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이고 y 가 NaN 이면
true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 false 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 false 반환
x 가 y 이면 true 반환
false 반환
6.1.6.1.15 Number::sameValueZero ( x ,
y )
추상 연산 Number::sameValueZero는 인자 x (Number), y (Number)를 받고 Boolean을
반환합니다. 호출 시 다음 단계를 수행합니다:
x 가 NaN 이고 y 가 NaN 이면
true 반환
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 true 반환
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 true 반환
x 가 y 이면 true 반환
false 반환
6.1.6.1.16 NumberBitwiseOp ( op , x ,
y )
추상 연산 NumberBitwiseOp는 인자 op (&, ^, 또는
|), x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
lNum 을 ! ToInt32 (x )로 설정한다.
rNum 을 ! ToInt32 (y )로 설정한다.
lBits 를 ℝ (lNum )을 나타내는 32비트 2의 보수 비트열로 설정한다.
rBits 를 ℝ (rNum )을 나타내는 32비트 2의 보수 비트열로 설정한다.
op 이 &이면
result 를 lBits 와 rBits 에 비트 AND 연산을 적용한
결과로 설정한다.
그 외 op 이 ^이면
result 를 lBits 와 rBits 에 비트 XOR 연산을 적용한
결과로 설정한다.
그 외
Assert : op 은
|이다.
result 를 lBits 와 rBits 에 비트 OR 연산을 적용한 결과로
설정한다.
result 32비트 2의 보수 비트열이 나타내는 정수 의 Number
값 을 반환한다.
6.1.6.1.17 Number::bitwiseAND ( x , y )
추상 연산 Number::bitwiseAND는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (&,
x , y )를 반환한다.
6.1.6.1.18 Number::bitwiseXOR ( x , y )
추상 연산 Number::bitwiseXOR는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (^,
x , y )를 반환한다.
6.1.6.1.19 Number::bitwiseOR ( x , y )
추상 연산 Number::bitwiseOR는 인자 x (Number), y (Number)를 받고 정수(Number) 를 반환합니다. 호출 시 다음 단계를 수행합니다:
NumberBitwiseOp (|,
x , y )를 반환한다.
6.1.6.1.20 Number::toString ( x , radix
)
추상 연산 Number::toString은 인자 x (Number), radix (정수 , 포함
구간 2~36)을 받고 String을 반환합니다. x 를 radix 진법 위치
표기법(positional numeral system)으로 String으로 표현합니다. r 진법으로 수를 표현할 때 사용하는 숫자는
"0123456789abcdefghijklmnopqrstuvwxyz" 의 앞 r 코드 유닛을 순서대로
사용합니다. 크기가 1 𝔽 이상인 숫자의 표현에는 선행 0이 포함되지 않습니다. 호출 시 다음 단계를
수행합니다:
x 가 NaN 이면 "NaN" 반환
x 가 +0 𝔽 또는
-0 𝔽 이면 "0" 반환
x < -0 𝔽 이면 string-concatenation ("-" ,
Number::toString (-x ,
radix )) 반환
x 가 +∞ 𝔽 이면 "Infinity"
반환
n , k ,
s 를 정수 로 정한다. k ≥ 1이며,
radix k - 1 ≤ s <
radix k 이고, 𝔽 (s ×
radix n - k )가 x 이며,
k 는 최소가 되도록 한다. k 는 s 를 radix 로 표현할 때의
자릿수이며, s 는 radix 로 나누어떨어지지 않으며, 최하위 자릿수는 반드시 유일하게 결정되지는 않는다.
radix ≠ 10 또는 n 이 포함 구간 -5~21에 있으면
n ≥ k 이면
s 를 radix 로 표현한 k 자리 코드 유닛과,
n - k 개의 0x0030(DIGIT ZERO) 코드 유닛을
string-concatenation 하여
반환한다.
그 외 n > 0이면
s 를 radix 로 표현한 상위 n 자리 코드 유닛,
0x002E(FULL STOP) 코드 유닛, 나머지 k - n 자리 코드
유닛을 string-concatenation 하여
반환한다.
그 외
Assert : n ≤ 0.
0x0030(DIGIT ZERO), 0x002E(FULL STOP), -n 개의
0x0030(DIGIT ZERO), s 를 radix 로 표현한
k 자리 코드 유닛을 string-concatenation 하여
반환한다.
NOTE: 이 경우 입력은 1.2e+3과 같은 과학적 E 표기로 표현된다.
Assert :
radix 는 10이다.
n < 0이면
exponentSign 을 0x002D(HYPHEN-MINUS) 코드 유닛으로 설정한다.
그 외
exponentSign 을 0x002B(PLUS SIGN) 코드 유닛으로 설정한다.
k = 1이면
단일 자리 s 코드 유닛, 0x0065(LATIN SMALL LETTER E),
exponentSign , abs (n - 1)를 10진수로 표현한
코드 유닛을 string-concatenation 하여
반환한다.
상위 자리 s 의 10진수 코드 유닛, 0x002E(FULL STOP), 나머지 k - 1자리 10진수
코드 유닛, 0x0065(LATIN SMALL LETTER E), exponentSign , abs (n
- 1)를 10진수로 표현한 코드 유닛을 string-concatenation 하여 반환한다.
참고 1
다음 사항은 구현 가이드라인으로 유용할 수 있지만, 표준의 규범적 요구사항은 아닙니다:
x가 -0 𝔽 이 아닌 모든 Number 값이면, ToNumber (ToString (x))는 x와 같다.
s 의 최하위 자릿수는 5
단계의 요구조건에 따라 항상 유일하게 결정되지 않는다.
참고 2
규칙보다 더 정확한 변환을 제공하는 구현에서는 아래 대체 버전의 5 단계를
가이드라인으로 사용하는 것이 권장됩니다:
n , k , s 를 정수 로 정한다.
k ≥ 1, radix k - 1 ≤
s < radix k , 𝔽 (s ×
radix n - k )가 x 이며,
k 는 최소가 되도록 한다. s 의 후보가 여러 개일 경우, s ×
radix n - k 가 ℝ (x )에
가장 가까운 값을 s 로 선택한다. 두 후보가 있을 경우 짝수 값을 선택한다. k 는
s 를 radix 로 표현할 때의 자릿수이며, s 는
radix 로 나누어떨어지지 않는다.
참고 3
ECMAScript 구현자는 David M. Gay가 작성한 부동소수점 이진-10진 변환 관련 논문 및 코드를 참고할 수 있습니다:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions.
Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill,
New Jersey). 1990년 11월 30일.
https://ampl.com/_archive/first-website/REFS/rounding.pdf .
관련 코드: http://netlib.sandia.gov/fp/dtoa.c
및 http://netlib.sandia.gov/fp/g_fmt.c .
여러 netlib 미러 사이트에서도 찾을 수 있습니다.
6.1.6.2 BigInt 타입
BigInt 타입 은 정수 값을 나타냅니다.
값의 크기는 제한이 없으며, 특정 비트 폭에 국한되지 않습니다. 별도 언급이 없는 한, 연산은 일반적으로 정확한 수학적 결과를 제공합니다.
이진 연산에서는 BigInt가 2의 보수 이진 문자열로 동작하며, 음수는 왼쪽으로 무한히 비트가 설정된 것으로 취급됩니다.
6.1.6.2.1 BigInt::unaryMinus ( x )
추상 연산 BigInt::unaryMinus는 인자 x (BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:
x = 0 ℤ 이면
0 ℤ 를 반환한다.
-x 를 반환한다.
6.1.6.2.2 BigInt::bitwiseNOT ( x )
추상 연산 BigInt::bitwiseNOT는 인자 x (BigInt)를 받고 BigInt를 반환합니다. x 의 1의 보수
값을 반환합니다. 호출 시 다음 단계를 수행합니다:
-x - 1 ℤ 를 반환한다.
6.1.6.2.3 BigInt::exponentiate ( base ,
exponent )
추상 연산 BigInt::exponentiate는 인자 base (BigInt), exponent (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
exponent < 0 ℤ 이면
RangeError 예외를 던진다.
base = 0 ℤ 이고 exponent =
0 ℤ 이면 1 ℤ 를 반환한다.
base 를 exponent 거듭제곱한 값을 반환한다.
6.1.6.2.4 BigInt::multiply ( x , y )
추상 연산 BigInt::multiply는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
x × y 를 반환한다.
참고
결과가 입력보다 훨씬 더 큰 비트폭을 갖더라도 정확한 수학적 결과가 반환됩니다.
6.1.6.2.5 BigInt::divide ( x , y )
추상 연산 BigInt::divide는 인자 x (BigInt), y (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
y = 0 ℤ 이면 RangeError
예외를 던진다.
quotient 를 ℝ (x ) / ℝ (y )로 설정한다.
ℤ (truncate (quotient ))를
반환한다.
6.1.6.2.6 BigInt::remainder ( n , d )
추상 연산 BigInt::remainder는 인자 n (BigInt), d (BigInt)를 받고
정상 완료 BigInt 또는
예외 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
d = 0 ℤ 이면 RangeError
예외를 던진다.
n = 0 ℤ 이면
0 ℤ 를 반환한다.
quotient 를 ℝ (n ) / ℝ (d )로 설정한다.
q 를 ℤ (truncate (quotient ))로
설정한다.
n - (d × q )를 반환한다.
참고
결과의 부호는 피제수의 부호와 동일합니다.
6.1.6.2.7 BigInt::add ( x , y )
추상 연산 BigInt::add는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다. 호출 시
다음 단계를 수행합니다:
x + y 를 반환한다.
6.1.6.2.8 BigInt::subtract ( x , y )
추상 연산 BigInt::subtract는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
x - y 를 반환한다.
6.1.6.2.9 BigInt::leftShift ( x , y )
추상 연산 BigInt::leftShift는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
y < 0 ℤ 이면
ℤ (floor (ℝ (x )
/ 2-ℝ (y ) ))를 반환한다.
x × 2 ℤ y 를 반환한다.
참고
여기서 의미론은 BigInt를 무한 길이의 2의 보수 이진 문자열로 간주한 비트 시프트와 동일해야 합니다.
6.1.6.2.10 BigInt::signedRightShift ( x ,
y )
추상 연산 BigInt::signedRightShift는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigInt::leftShift (x ,
-y )를 반환한다.
6.1.6.2.11 BigInt::unsignedRightShift ( x ,
y )
추상 연산 BigInt::unsignedRightShift는 인자 x (BigInt), y (BigInt)를 받고
예외 완료 를 반환합니다. 호출
시 다음 단계를 수행합니다:
TypeError 예외를 던진다.
6.1.6.2.12 BigInt::lessThan ( x , y )
추상 연산 BigInt::lessThan는 인자 x (BigInt), y (BigInt)를 받고 Boolean을 반환합니다.
호출 시 다음 단계를 수행합니다:
ℝ (x )
< ℝ (y )이면 true 반환,
아니면 false 반환
6.1.6.2.13 BigInt::equal ( x , y )
추상 연산 BigInt::equal는 인자 x (BigInt), y (BigInt)를 받고 Boolean을 반환합니다. 호출
시 다음 단계를 수행합니다:
ℝ (x ) =
ℝ (y )이면
true 반환, 아니면 false 반환
6.1.6.2.14 BinaryAnd ( x , y )
추상 연산 BinaryAnd는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1이고 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.15 BinaryOr ( x , y )
추상 연산 BinaryOr는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1 또는 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.16 BinaryXor ( x , y )
추상 연산 BinaryXor는 인자 x (0 또는 1), y (0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음
단계를 수행합니다:
x = 1이고 y = 0이면 1 반환
그 외 x = 0이고 y = 1이면 1 반환
그 외에는 0 반환
6.1.6.2.17 BigIntBitwiseOp ( op , x ,
y )
추상 연산 BigIntBitwiseOp는 인자 op (&, ^,
|), x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음
단계를 수행합니다:
x 를 ℝ (x )로 설정한다.
y 를 ℝ (y )로 설정한다.
result 를 0으로 설정한다.
shift 를 0으로 설정한다.
반복, (x = 0 또는 x = -1)이고 (y = 0 또는 y
= -1)일 때까지
xDigit 를 x modulo 2로 설정한다.
yDigit 를 y modulo 2로 설정한다.
op 이 &이면
result 를 result +
2shift × BinaryAnd (xDigit ,
yDigit )로 설정한다.
그 외 op 이 |이면
result 를 result +
2shift × BinaryOr (xDigit ,
yDigit )로 설정한다.
그 외
Assert : op 은
^이다.
result 를 result +
2shift × BinaryXor (xDigit ,
yDigit )로 설정한다.
shift 를 shift + 1로 설정한다.
x 를 (x - xDigit ) / 2로 설정한다.
y 를 (y - yDigit ) / 2로 설정한다.
op 이 &이면
tmp 를 BinaryAnd (x
modulo 2, y
modulo 2)로 설정한다.
그 외 op 이 |이면
tmp 를 BinaryOr (x
modulo 2, y
modulo 2)로 설정한다.
그 외
Assert : op 은
^이다.
tmp 를 BinaryXor (x
modulo 2, y
modulo 2)로 설정한다.
tmp ≠ 0이면
result 를 result - 2shift 로
설정한다.
참고: 이 연산은 부호를 확장합니다.
BigInt value for
result 를 반환한다.
6.1.6.2.18 BigInt::bitwiseAND ( x , y )
추상 연산 BigInt::bitwiseAND는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (&,
x , y )를 반환한다.
6.1.6.2.19 BigInt::bitwiseXOR ( x , y )
추상 연산 BigInt::bitwiseXOR는 인자 x (BigInt), y (BigInt)를 받고 BigInt를
반환합니다. 호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (^,
x , y )를 반환한다.
6.1.6.2.20 BigInt::bitwiseOR ( x , y )
추상 연산 BigInt::bitwiseOR는 인자 x (BigInt), y (BigInt)를 받고 BigInt를 반환합니다.
호출 시 다음 단계를 수행합니다:
BigIntBitwiseOp (|,
x , y )를 반환한다.
6.1.6.2.21 BigInt::toString ( x , radix
)
추상 연산 BigInt::toString은 인자 x (BigInt), radix (정수 , 포함
구간 2~36)을 받고 String을 반환합니다. x 를 radix 진법 위치
표기법으로 String으로 표현합니다. r 진법으로 BigInt를 표현할 때 사용하는 숫자는
"0123456789abcdefghijklmnopqrstuvwxyz" 의 앞 r 코드 유닛을 순서대로
사용합니다. 0 ℤ 이 아닌 BigInt의 표현에는 결코 선행 0이 포함되지 않습니다. 호출 시 다음 단계를
수행합니다:
x < 0 ℤ 이면 string-concatenation ("-" ,
BigInt::toString (-x ,
radix ))를 반환한다.
x 를 radix 로 표현한 String 값을 반환한다.
6.1.7 오브젝트 타입
각 Object 타입 인스턴스(간단히 “오브젝트”라
부름)는 프로퍼티의 집합을 나타냅니다.
각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:
데이터 프로퍼티 는 키 값을 ECMAScript 언어 값 과 Boolean 속성 집합에
연결합니다.
접근자 프로퍼티 는 키 값을 하나 또는 두 개의 접근자 함수와
Boolean 속성 집합에 연결합니다. 접근자 함수는 해당 프로퍼티에 연결된 ECMAScript 언어 값 를
저장하거나 검색하는 데 사용됩니다.
오브젝트의 프로퍼티는 프로퍼티
키 를 사용하여 고유하게 식별됩니다. 프로퍼티 키 는
문자열(String) 또는 심볼(Symbol)입니다. 빈 문자열을 포함한 모든 문자열과 심볼은 프로퍼티 키 로 사용할 수 있습니다. 프로퍼티 이름 은 프로퍼티 키 중 문자열(String) 인 값입니다.
정수 인덱스 는
프로퍼티 이름
n 으로, CanonicalNumericIndexString (n )이
정수(Number) 를 포함 구간
+0 𝔽 ~ 𝔽 (253 - 1) 내에서 반환하는 경우를 의미합니다. 배열 인덱스 는 정수 인덱스
n 으로, CanonicalNumericIndexString (n )이
정수(Number) 를 포함 구간
+0 𝔽 ~ 𝔽 (232 - 2) 내에서 반환하는 경우를 의미합니다.
참고
모든 음이 아닌 안전
정수 는 해당하는 정수 인덱스 가 있습니다. 32비트 부호 없는 정수 중 232 - 1 을 제외한 모든 값은 해당하는 배열 인덱스 가
있습니다. "-0" 은 정수 인덱스 나 배열 인덱스 에 해당하지 않습니다.
프로퍼티 키 는 프로퍼티
및 그 값을 접근하는 데 사용됩니다. 프로퍼티 접근 방법에는 get (값 조회)과 set (값 할당)의 두 가지가 있습니다. get/set
접근으로 접근 가능한 프로퍼티에는 오브젝트의 자신의 프로퍼티(own properties) 와, 프로퍼티 상속 관계를 통해 다른 연관 객체가 제공하는
상속 프로퍼티(inherited properties) 가 포함됩니다. 상속 프로퍼티는 연관 객체의 own이나 inherited 프로퍼티일 수 있습니다. 한
오브젝트의 모든 own 프로퍼티는 서로 다른 키 값을 가져야 합니다.
모든 오브젝트는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근 및 조작의 의미론에 따라 여러 형태의 오브젝트가 존재합니다. 다양한 오브젝트 형태에 대한 정의는
6.1.7.2 를 참고하세요.
또한 일부 오브젝트는 호출할 수 있습니다. 이들은 함수 또는 함수 오브젝트 라 부르며, 아래에서 더 자세히 설명합니다. ECMAScript의 모든
함수는 Object 타입의 멤버입니다.
6.1.7.1 프로퍼티 속성
속성은 이 명세에서 표 3 에 설명된 대로 객체 프로퍼티의 상태를
정의하고 설명하는 데 사용됩니다. 명시적으로 지정하지 않는 한, 각 속성의 초기값은 기본값(Default Value)입니다.
표 3: 객체 프로퍼티의 속성
속성 이름
해당 프로퍼티 타입
값의 도메인
기본값
설명
[[Value]]
데이터 프로퍼티
ECMAScript 언어
값
undefined
get 접근 시 프로퍼티에서 조회되는 값입니다.
[[Writable]]
데이터 프로퍼티
Boolean
false
false 일 경우, ECMAScript 코드에서 [[Set]] 으로 [[Value]] 속성을
변경하려 해도 성공하지 않습니다.
[[Get]]
접근자 프로퍼티
오브젝트 또는 undefined
undefined
값이 오브젝트 라면, 반드시 함수
오브젝트 여야 합니다. 함수의 [[Call]]
내부 메서드(표
5 )가 빈 인자 리스트로 호출되어, get 접근 시마다 프로퍼티 값을 반환합니다.
[[Set]]
접근자 프로퍼티
오브젝트 또는 undefined
undefined
값이 오브젝트 라면, 반드시 함수
오브젝트 여야 합니다. 함수의 [[Call]]
내부 메서드(표
5 )가 단일 인자로 할당값을 넘겨 호출되며, set 접근 시마다 실행됩니다. 프로퍼티의
[[Set]] 내부 메서드의 효과는, 이후 [[Get]] 내부 메서드 호출 결과에 영향을 줄 수도 있고, 주지 않을 수도
있습니다.
[[Enumerable]]
데이터 프로퍼티 또는 접근자 프로퍼티
Boolean
false
true 이면, for-in 반복문(14.7.5 )에
의해 열거됩니다. 그렇지 않으면, 해당 프로퍼티는 비열거형(non-enumerable)입니다.
[[Configurable]]
데이터 프로퍼티 또는 접근자 프로퍼티
Boolean
false
false 인 경우, 해당 프로퍼티를 삭제하거나, 데이터 프로퍼티 를 접근자 프로퍼티 로, 또는 반대로 변경하거나,
(기존 [[Value]] 교체나 [[Writable]] 을 false 로 변경하는 경우를
제외하고) 속성에 변경을 가하려 해도 실패합니다.
6.1.7.2 오브젝트 내부 메서드와 내부 슬롯
ECMAScript에서 오브젝트의 실제 의미론은 내부 메서드 라 불리는 알고리즘으로 지정됩니다. ECMAScript 엔진의 각 오브젝트는 런타임 동작을
정의하는 일련의 내부 메서드와 연관되어 있습니다. 이러한 내부 메서드는 ECMAScript 언어의 일부가 아니며, 명세상 설명 목적으로만 정의됩니다. 하지만
ECMAScript 구현 내의 각 오브젝트는 해당 내부 메서드가 명세한 대로 동작해야 합니다. 그 구현 방식은 구현체에 따라 다릅니다.
내부 메서드 이름은 다형적입니다. 즉, 동일한 내부 메서드 이름이 호출될 때 오브젝트 값에 따라 서로 다른 알고리즘이 실행될 수 있습니다. 내부 메서드가 호출되는 실제
오브젝트가 "타겟"입니다. 런타임 시 어떤 알고리즘이 오브젝트가 지원하지 않는 내부 메서드를 사용하려고 하면 TypeError
예외가 발생합니다.
내부 슬롯은 객체, 심볼 또는 프라이빗 네임 과 연관된 내부 상태를 나타내며,
다양한 ECMAScript 명세 알고리즘에서 사용됩니다. 내부 슬롯은 객체 속성이 아니며 상속되지 않습니다. 특정 내부 슬롯 명세에 따라, 이러한 상태는
ECMAScript 언어 타입 의 값이나 특정
ECMAScript 명세 타입 값으로 구성될 수 있습니다.
명시적으로 달리 규정되지 않는 한, 내부 슬롯은 객체, 심볼 또는 프라이빗 네임 을 생성하는 과정의 일부로 할당되며 동적으로 추가될 수 없습니다.
별도로 명시되지 않는 한, 내부 슬롯의 초기 값은 undefined 값입니다. 이 명세 내의 다양한 알고리즘은 내부 슬롯을 가진
값을 생성합니다.
그러나 ECMAScript 언어는 내부 슬롯을 직접 조작할 수 있는 방법을 제공하지 않습니다.
모든 오브젝트는 [[PrivateElements]] 라는 내부 슬롯을 갖는데, 이는 List 타입의 PrivateElements 목록입니다.
이 List 는 해당 오브젝트의 private
필드, 메서드, 접근자의 값을 나타냅니다. 초기값은 빈 List 입니다.
내부 메서드와 내부 슬롯은 명세에서 [[ ]]로 감싸서 표기됩니다.
표 4 는 ECMAScript 코드로 생성하거나
조작할 수 있는 모든 오브젝트에 적용되는 필수 내부 메서드 를 요약합니다. 모든 오브젝트는 이 필수 내부 메서드의 알고리즘을 가져야 합니다. 그러나
모든 오브젝트가 반드시 동일한 알고리즘을 사용하는 것은 아닙니다.
일반 오브젝트 는 다음 조건을 모두
만족하는 오브젝트입니다:
표 4 에 나열된 내부 메서드에 대해,
10.1 에
정의된 메서드를 사용한다.
오브젝트에 [[Call]] 내부 메서드가 있으면, 10.2.1
또는 10.3.1
중 하나를 사용한다.
오브젝트에 [[Construct]] 내부 메서드가 있으면, 10.2.2
또는 10.3.2
중 하나를 사용한다.
이색 오브젝트(exotic object) 는
일반
오브젝트 가 아닌 오브젝트입니다.
이 명세는 오브젝트의 내부 메서드에 따라 다양한 이색 오브젝트 유형을 구분합니다. 어떤 오브젝트가 특정 종류의 이색 오브젝트 (예:
배열 이색
오브젝트 또는 바운드 함수 이색 오브젝트 등)와
동작상 동일하더라도 명세된 내부 메서드 모음을 모두 갖추지 않으면 그 종류로 인식되지 않습니다.
표 4 의 “시그니처(Signature)” 열 및
유사한 표들은 각 내부 메서드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 감싼 설명적 인자 이름들이 포함됩니다. 인자 이름이 ECMAScript 타입명과
같으면 해당 타입이어야 함을 의미합니다. 내부 메서드가 명시적으로 반환값을 가지면 인자 목록 뒤에 “→”와 반환 타입이 붙습니다. 이 시그니처에 쓰인 타입 이름은
6 절 정의에 다음 명칭이 추가된 것입니다.
“any ”는 ECMAScript 언어 타입 중 아무 값이나 올 수
있음을 의미합니다.
내부 메서드는 인자 외에도 항상 호출 타겟 오브젝트에 접근할 수 있습니다.
내부 메서드는 암시적으로 Completion Record 를
반환합니다. 이는 normal completion (호출
패턴에서 제시된 반환 타입 값을 감쌈) 또는 throw
completion 일 수 있습니다.
표 4: 필수 내부 메서드
내부 메서드
시그니처
설명
[[GetPrototypeOf]]
( ) → Object | Null
이 오브젝트의 상속 프로퍼티를 제공하는 오브젝트를 결정합니다. null 은 상속 프로퍼티가 없음을
의미합니다.
[[SetPrototypeOf]]
(Object | Null) → Boolean
이 오브젝트를 상속 프로퍼티를 제공하는 다른 오브젝트와 연결합니다. null 을 넘기면 상속
프로퍼티가 없음을 의미합니다. 연산이 성공하면 true , 실패하면
false 를 반환합니다.
[[IsExtensible]]
( ) → Boolean
이 오브젝트에 추가 프로퍼티를 추가할 수 있는지 여부를 결정합니다.
[[PreventExtensions]]
( ) → Boolean
이 오브젝트에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true , 실패하면
false 를 반환합니다.
[[GetOwnProperty]]
(propertyKey ) → Undefined | Property
Descriptor
이 오브젝트의 own 프로퍼티 중 propertyKey 를 키로 하는 프로퍼티에 대한 Property
Descriptor 를 반환하거나, 해당 프로퍼티가 없으면
undefined 를 반환합니다.
[[DefineOwnProperty]]
(propertyKey , PropertyDescriptor ) → Boolean
propertyKey 를 키로 하는 own 프로퍼티를 PropertyDescriptor 로
기술된 상태로 생성하거나 변경합니다. 성공하면 true , 아니면
false 를 반환합니다.
[[HasProperty]]
(propertyKey ) → Boolean
이 오브젝트에 propertyKey 를 키로 하는 own 또는 상속 프로퍼티가 있는지 Boolean 값으로
반환합니다.
[[Get]]
(propertyKey , Receiver ) → any
이 오브젝트에서 propertyKey 를 키로 하는 프로퍼티의 값을 반환합니다. 프로퍼티 값을 얻기 위해
ECMAScript 코드를 실행해야 하는 경우, Receiver 가 코드 평가 시
this 값으로 사용됩니다.
[[Set]]
(propertyKey , value , Receiver ) →
Boolean
propertyKey 에 해당하는 프로퍼티의 값을 value 로 설정합니다. 프로퍼티 값을
설정하기 위해 ECMAScript 코드를 실행해야 하는 경우, Receiver 가 코드 평가 시
this 값으로 사용됩니다. 설정에 성공하면 true ,
실패하면 false 를 반환합니다.
[[Delete]]
(propertyKey ) → Boolean
이 오브젝트에서 propertyKey 를 키로 하는 own 프로퍼티를 삭제합니다. 프로퍼티가 삭제되지 않고
여전히 존재하면 false 를 반환합니다. 프로퍼티가 삭제됐거나 존재하지 않으면
true 를 반환합니다.
[[OwnPropertyKeys]]
( ) → List
of property keys
이 오브젝트의 own 프로퍼티 키 전체를 요소로 갖는 List 를
반환합니다.
표
5 는 함수로 호출 가능한 오브젝트가 지원하는 추가 필수 내부 메서드를 요약합니다. 함수 오브젝트 는 [[Call]] 내부 메서드를 지원하는 오브젝트이고, 생성자 는 [[Construct]]
내부 메서드를 지원하는 오브젝트입니다. [[Construct]] 를 지원하는 모든 오브젝트는 반드시 [[Call]] 도 지원해야 합니다. 즉, 모든 생성자 는 함수
오브젝트 여야 합니다. 따라서 생성자 는 생성자 함수 또는 생성자
함수
오브젝트 라고도 부를 수 있습니다.
표 5: 함수 오브젝트의 추가 필수 내부 메서드
내부 메서드
시그니처
설명
[[Call]]
(any , List
of any ) → any
이 오브젝트와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메서드의 인자는
this 값과, 호출 표현식으로 함수에 전달된 인자를 요소로 갖는 List 입니다.
이 내부 메서드를 구현한 오브젝트는 호출 가능(callable) 합니다.
[[Construct]]
(List
of any , Object) → Object
오브젝트를 생성합니다. new 연산자나 super 호출을 통해 실행됩니다. 내부
메서드의 첫 번째 인자는 List 로,
생성자 호출 또는 super 호출의 인자들을 요소로 갖습니다. 두 번째 인자는
new 연산자가 처음 적용된 오브젝트입니다. 이 내부 메서드를 구현한 오브젝트를 생성자 라 합니다. 함수
오브젝트 가 반드시 생성자 인 것은 아니며,
[[Construct]] 내부 메서드가 없는 함수
오브젝트 도 있습니다.
일반
오브젝트 와 표준 이색 오브젝트 의 필수 내부 메서드의 의미론은 10 절에 명시되어 있습니다. 만약
이색
오브젝트 의 내부 메서드를 구현에서 지원하지 않는 경우, 해당 사용 시 TypeError
예외를 반드시 발생시켜야 합니다.
6.1.7.3 필수 내부 메서드의 불변 조건
ECMAScript 엔진의 오브젝트 내부 메서드는 아래에 명시된 불변 조건(invariant)을 반드시 준수해야 합니다. 이 명세의 일반 ECMAScript 오브젝트
및 모든 표준 이색
오브젝트 는 이러한 불변 조건을 유지합니다. ECMAScript Proxy 오브젝트는 [[ProxyHandler]] 오브젝트의 트랩(trap) 결과에 대한 런타임 검사를 통해 이 불변 조건을 유지합니다.
구현체가 제공하는 이색
오브젝트 도 반드시 이 불변 조건을 지켜야 합니다. 이러한 불변 조건이 위반되면 ECMAScript 코드에서 예측 불가한
동작이나 보안 문제가 발생할 수 있습니다. 단, 이 불변 조건 위반이 구현체의 메모리 안전성을 절대 해쳐서는 안 됩니다.
구현체는 필수 내부 메서드의 기능을 우회적으로 제공하여 이 불변 조건을 우회할 수 있게 해서는 안 됩니다.
정의(Definitions):
내부 메서드의 target 은 해당 내부 메서드가 호출되는 오브젝트입니다.
[[IsExtensible]] 내부 메서드가 false 를 반환하거나, [[PreventExtensions]] 내부 메서드가 true 를 반환한 경우 그
타겟은 비확장(non-extensible) 입니다.
존재하지 않는(non-existent) 프로퍼티란 비확장 타겟에 own 프로퍼티로 존재하지 않는 프로퍼티입니다.
SameValue 에 대한 참조는 SameValue
알고리즘의 정의에 따릅니다.
반환 값(Return value):
모든 내부 메서드의 반환 값은 다음 중 하나를 가지는 Completion
Record 여야 합니다:
[[Type]] = normal , [[Target]] = empty , [[Value]] = 해당 내부 메서드의 아래에 명시된 "정상 반환 타입(normal return type)"의 값
[[Type]] = throw , [[Target]] = empty , [[Value]] = 임의의 ECMAScript 언어
값
참고 1
[[GetPrototypeOf]] ( )
정상 반환 타입은 Object 또는 Null입니다.
타겟이 비확장이고 [[GetPrototypeOf]] 가 값 V 를 반환한 경우, 이후 모든
[[GetPrototypeOf]] 호출은 SameValue 로 V 와 동일한
값을 반환해야 합니다.
참고 2
오브젝트의 프로토타입 체인은 유한 길이를 가져야 합니다(즉, 어떤 오브젝트에서 시작해 [[GetPrototypeOf]] 내부 메서드를 재귀적으로 적용하면 결국
null 에 도달해야 함). 하지만 프로토타입 체인에 일반 오브젝트 의 정의를 따르지 않는
이색
오브젝트 가 포함되면 이 조건은 오브젝트 수준에서 강제할 수 없습니다. 이러한 순환 프로토타입 체인은 오브젝트
프로퍼티 접근 시 무한 루프를 야기할 수 있습니다.
[[SetPrototypeOf]] ( V )
정상 반환 타입은 Boolean입니다.
타겟이 비확장일 때, V 가 타겟의 관찰된 [[GetPrototypeOf]] 값과
SameValue 가 아닌 한 [[SetPrototypeOf]] 는 반드시 false 를 반환해야 합니다.
[[IsExtensible]] ( )
정상 반환 타입은 Boolean입니다.
[[IsExtensible]] 이 false 를 반환한 경우, 이후 해당 타겟의
모든 [[IsExtensible]] 호출은 false 를 반환해야 합니다.
[[PreventExtensions]] ( )
정상 반환 타입은 Boolean입니다.
[[PreventExtensions]] 이 true 를 반환한 경우, 이후 해당
타겟의 모든 [[IsExtensible]] 호출은 false 를 반환해야 하며,
타겟은 이제 비확장으로 간주합니다.
[[GetOwnProperty]] ( P )
정상 반환 타입은 Property
Descriptor 또는 Undefined입니다.
반환값이 Property
Descriptor 이면, 반드시 모든 필드가 채워진 Property
Descriptor 여야 합니다.
P 가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 기술된 경우, 이후의 모든 [[GetOwnProperty]] ( P ) 호출은 [[Value]] 가 P 의 [[Value]] 와
SameValue 인 Property
Descriptor 를 반환해야 합니다.
P 의 [[Writable]] 및 [[Value]]
이외의 속성이 변할 수 있거나, 프로퍼티가 삭제될 수 있다면 P 의 [[Configurable]] 속성은 true 여야 합니다.
[[Writable]] 속성이 false 에서
true 로 바뀔 수 있다면, [[Configurable]] 속성도
true 여야 합니다.
타겟이 비확장이고 P 가 존재하지 않는 own 프로퍼티라면, 이후의 모든 [[GetOwnProperty]] (P ) 호출은 P 를 존재하지 않는 것으로
설명해야 하며, 즉 [[GetOwnProperty]] (P )는
undefined 를 반환해야 합니다.
참고 3
세 번째 불변 조건의 결과로, 어떤 프로퍼티가 데이터 프로퍼티 로 기술되고 시간이 지남에 따라 다른 값을 반환할 수
있는 경우, 해당 프로퍼티의 [[Writable]] 이나 [[Configurable]] 속성, 또는 둘 다 true 여야 합니다.
비록 그 값을 바꿀 수 있는 메커니즘이 다른 필수 내부 메서드로 노출되어 있지 않더라도 말입니다.
[[DefineOwnProperty]] ( P , Desc )
정상 반환 타입은 Boolean입니다.
[[DefineOwnProperty]] 는 P 가 타겟의 비설정 가능 own 프로퍼티로 관찰된
적이 있다면, 아래 둘 중 하나가 아닌 한 반드시 false 를 반환해야 합니다:
P 가 쓰기 가능한 데이터 프로퍼티 이다. 비설정 가능 쓰기 가능한
데이터
프로퍼티 는 비설정 가능 비쓰기 가능한 데이터 프로퍼티 로 변경될 수 있다.
Desc 의 모든 속성이 P 의 속성과 SameValue 이다.
[[DefineOwnProperty]] (P , Desc )는 타겟이
비확장이면서 P 가 존재하지 않는 own 프로퍼티라면 반드시 false 를 반환해야 합니다. 즉, 비확장
타겟 오브젝트에는 새 프로퍼티를 추가할 수 없습니다.
[[HasProperty]] ( P )
정상 반환 타입은 Boolean입니다.
P 가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티 로 관찰된 적이 있다면, [[HasProperty]] 는 true 를 반환해야 합니다.
[[Get]] ( P , Receiver )
정상 반환 타입은 ECMAScript 언어 타입 중 임의의
값입니다.
P 가 값 V 를 가진 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 관찰된 적이 있다면, [[Get]] 은 반드시 V 와 SameValue 인 값을 반환해야 합니다.
P 가 [[Get]] 속성이 undefined 인 비설정 가능
own 접근자
프로퍼티 로 관찰된 적이 있다면, [[Get]] 연산은 반드시
undefined 를 반환해야 합니다.
[[Set]] ( P , V , Receiver )
정상 반환 타입은 Boolean입니다.
P 가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티 로 관찰된 적이 있다면, [[Set]] 은 V 가 P 의 [[Value]] 와 SameValue 인 경우를 제외하고 반드시
false 를 반환해야 합니다.
P 가 [[Set]] 속성이 undefined 인 비설정 가능
own 접근자
프로퍼티 로 관찰된 적이 있다면, [[Set]] 연산은 반드시
false 를 반환해야 합니다.
[[Delete]] ( P )
정상 반환 타입은 Boolean입니다.
P 가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티 로 관찰된 적이 있다면, [[Delete]] 는 false 를 반환해야 합니다.
[[OwnPropertyKeys]] ( )
정상 반환 타입은 List 입니다.
반환된 List 에는 중복 항목이 없어야
합니다.
반환된 List 의 각 요소는
프로퍼티
키 여야 합니다.
반환된 List 에는 이전에 관찰된 모든
비설정 가능 own 프로퍼티의 키가 반드시 포함되어야 합니다.
타겟이 비확장일 경우, 반환된 List 에는 [[GetOwnProperty]] 로 관찰 가능한 타겟의 모든 own 프로퍼티의 키만 포함되어야 합니다.
[[Call]] ( )
[[Construct]] ( )
정상 반환 타입은 Object입니다.
타겟은 [[Call]] 내부 메서드도 반드시 가지고 있어야 합니다.
6.1.7.4 잘 알려진 내장 객체
잘 알려진 내장 객체들은 이 명세의 알고리즘에 의해 명시적으로 참조되는 내장 객체들이며, 일반적으로 realm 별로 고유한 정체성을 가진다. 별도로 명시되지 않는 한, 각 내장
객체는 실제로는 각 realm 마다
유사한 객체 집합에 해당한다.
이 명세에서 %name%과 같은 참조는 현재 realm 에 연결된, 해당 name에 해당하는 내장 객체를 의미한다. %name.a.b%와 같은
참조는, ECMAScript 코드가 평가되기 전에 내장 객체 %name%의 "a" 속성의 값에서
"b" 속성을 접근한 것과 같다. 현재 realm 과 그 내장 객체들의 결정 방법은 9.4 에 설명되어 있다. 잘 알려진 내장 객체들의 목록은
표 6 에 나와 있다.
표 6: 잘 알려진 내장 객체
참고
6.2 ECMAScript 명세 타입
명세 타입은 ECMAScript 언어 구성 요소와 ECMAScript 언어 타입 의 의미를 설명하기 위해 알고리즘 내에서
사용되는 메타값에 해당한다. 명세 타입에는 Reference Record , List , Completion Record , Property Descriptor ,
Environment Record , Abstract
Closure , 그리고 Data Block 이 포함된다. 명세 타입 값은 명세상의 산출물로, ECMAScript 구현
내의 특정 엔티티에 반드시 대응하지는 않는다. 명세 타입 값은 ECMAScript 표현식 평가의 중간 결과를 설명하는 데 사용될 수 있지만, 이러한 값은 객체의 프로퍼티나
ECMAScript 언어 변수의 값으로 저장될 수 없다.
6.2.1 Enum 명세 타입
Enums 는 명세 내부에서만 사용되는 값으로, ECMAScript 코드에서는 직접적으로
관찰할 수 없다. Enum은 sans-serif 글꼴로 표기된다. 예를 들어, Completion Record 의 [[Type]] 필드는 normal ,
return , 또는 throw 와 같은 값을 가진다. Enum은 이름 외의 특징이 없다.
Enum의 이름은 단지 다른 Enum과 구분하기 위한 용도일 뿐이며, 사용법이나 문맥상의 의미를 암시하지 않는다.
6.2.2 List와 Record 명세 타입
List 타입은 new 표현식의 인수 리스트 평가( 13.3.8
참고), 함수 호출, 기타 값의 간단한 순서형 리스트가 필요한 알고리즘의 설명에 사용된다. List 타입의 값은 개별 값으로 구성된 리스트 요소들의 단순한 순서 시퀀스이다.
이 시퀀스의 길이는 임의일 수 있다. 리스트의 요소는 0부터 시작하는 인덱스로 임의 접근이 가능하다. 표기상의 편의를 위해 배열과 유사한 문법으로 List 요소에 접근할 수
있다. 예를 들어, arguments [2]는 List arguments 의 세 번째 요소를 의미한다.
알고리즘이 List의 요소를 순서 지정 없이 반복할 때, 사용되는 순서는 List의 요소 순서이다.
이 명세 내에서 표기상의 편의를 위해, 리터럴 문법으로 새 List 값을 표현할 수 있다. 예를 들어, « 1, 2 »는 두 개의 요소를 가지며 각각 특정 값으로 초기화된
List 값을 정의한다. 새로운 빈 List는 « »로 표현할 수 있다.
이 명세에서 "the list-concatenation of A ,
B , ..." (각 인수가 비어 있을 수도 있는 List임)은 각 인수의 요소(순서대로)를 연결한 새로운 List 값을 의미한다.
List of String에 대해 "sorted according to lexicographic code unit order "라는 문구는, 짧은 문자열의 길이만큼 각 코드 유닛의 숫자값으로 정렬하고,
모두 같으면 짧은 문자열을 긴 문자열보다 먼저 정렬함을 의미한다. 이는 IsLessThan 추상 연산에서 설명된다.
Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용된다. Record
타입 값은 하나 이상의 이름 붙은 필드로 구성된다. 각 필드의 값은 ECMAScript 언어 값 또는 명세
값이다. 필드 이름은 항상 이중 대괄호로 감싸며, 예를 들어 [[Value]] 와 같다.
이 명세 내에서 표기상의 편의를 위해, 객체 리터럴과 유사한 문법으로 Record 값을 표현할 수 있다. 예를 들어, { [[Field1]] : 42, [[Field2]] :
false , [[Field3]] :
empty }는 세 개의 필드를 각각 특정 값으로 초기화한 Record 값을 정의한다. 필드 이름의 순서는 중요하지 않다.
명시적으로 나열되지 않은 필드는 존재하지 않는 것으로 간주한다.
명세 텍스트와 알고리즘에서는 점 표기법을 사용해 Record 값의 특정 필드를 참조할 수 있다. 예를 들어, 위에서 보인 record R에 대해 R.[[Field2]] 는 “R의 [[Field2]] 라는 이름의 필드”를 의미한다.
자주 사용되는 Record 필드 조합의 스키마는 이름을 붙일 수 있으며, 그 이름을 리터럴 Record 값에 접두사로 사용하여 특정 집합의 종류를 명확히 할 수 있다. 예:
PropertyDescriptor { [[Value]] : 42, [[Writable]] : false , [[Configurable]] : true }.
6.2.3 Set과 Relation 명세 타입
Set 타입은 메모리 모델 에서 사용하기 위한 비순서 요소의 집합을 설명하는 데 사용된다.
ECMAScript의 같은 이름을 가진 컬렉션 타입과는 다르다. 혼동을 피하기 위해, 이 명세에서는 ECMAScript 컬렉션의 인스턴스를 항상 "Set 객체"라고 부른다.
Set 타입의 값은 중복 없는 단순한 요소 집합이며, 요소를 추가하거나 제거할 수 있다. Set끼리는 합집합, 교집합, 차집합 연산이 가능하다.
Relation 타입은 Set에 대한 제약 조건을 설명하는 데 사용된다. Relation
타입의 값은 값 도메인에서의 순서쌍의 Set이다. 예를 들어, 이벤트에 대한 Relation은 이벤트 순서쌍의 집합이다. Relation R 과
R 의 값 도메인에 속한 두 값 a 와 b 에 대해, a R
b 는 순서쌍 (a , b )가 R 의 멤버임을 의미하는 약칭이다. Relation이 어떤 조건에
대해 최소 Relation 일 때, 이는 그 조건을 만족하는 가장 작은 Relation임을
의미한다.
strict partial order 는 Relation 값
R 이 다음 조건을 만족할 때를 말한다.
참고 1
위 두 속성은 각각 반사성 없음(irreflexivity)과 추이성(transitivity)이라 한다.
strict total order 는 Relation 값
R 이 다음 조건을 만족할 때를 말한다.
참고 2
위 세 속성은 각각 전체성(totality), 반사성 없음(irreflexivity), 추이성(transitivity)이라 한다.
6.2.4 완료 레코드 명세 타입
완료 레코드 명세 타입은 값의 런타임 전파와
break, continue, return, throw와 같이 비지역적 제어
흐름 전이를 수행하는 구문의 동작과 같은 제어 흐름을 설명하는 데 사용된다.
완료 레코드는 표 7 에 정의된 필드를 가진다.
표 7: 완료
레코드 필드
필드 이름
값
의미
[[Type]]
normal , break ,
continue , return , 또는
throw
발생한 완료의 타입.
[[Value]]
완료
레코드 가 아닌 임의의 값
생성된 값.
[[Target]]
문자열 또는 empty
지정된 제어 전이의 대상 레이블.
다음과 같은 축약 용어가 때때로 완료 레코드를 지칭하는 데 사용된다.
정상 완료 는 [[Type]] 값이 normal 인 모든 완료 레코드를 의미한다.
break 완료 는 [[Type]] 값이 break 인 모든 완료 레코드를 의미한다.
continue 완료 는 [[Type]] 값이 continue 인 모든 완료 레코드를 의미한다.
return 완료 는 [[Type]] 값이 return 인 모든 완료 레코드를 의미한다.
throw 완료 는 [[Type]] 값이 throw 인 모든 완료 레코드를 의미한다.
비정상 완료 는 [[Type]] 값이 normal 이 아닌 모든 완료 레코드를 의미한다.
특정 값이 포함된 정상 완료 는 [[Value]] 필드에 해당 타입의 값을 가진 정상 완료를 의미한다.
이 명세에서 정의된 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다. 그 외의 완료 레코드를 반환하는 것은 편집상의 오류로 간주된다.
구현
정의 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다.
6.2.4.1 NormalCompletion ( value )
추상 연산 NormalCompletion은 value (완료 레코드 가 아닌 임의의 값)를
인수로 받아 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
완료 레코드 {
[[Type]] :
normal , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.2 ThrowCompletion ( value )
추상 연산 ThrowCompletion은 value (ECMAScript 언어 값 )를
인수로 받아 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
완료 레코드 {
[[Type]] :
throw , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.3 ReturnCompletion ( value )
추상 연산 ReturnCompletion은 value (ECMAScript 언어 값 )를
인수로 받아 return 완료 를 반환한다. 호출
시 다음 단계를 수행한다:
완료 레코드 {
[[Type]] :
return , [[Value]] : value ,
[[Target]] : empty }를 반환한다.
6.2.4.4 UpdateEmpty ( completionRecord ,
value )
추상 연산 UpdateEmpty는 completionRecord ( 완료 레코드 )와
value ( 완료
레코드 가 아닌 임의의 값 )를 인수로 받아 완료 레코드 를 반환한다. 호출 시
다음 단계를 수행한다:
Assert :
completionRecord 가 return 완료 또는
throw 완료 인
경우, completionRecord .[[Value]] 는
empty 가 아니어야 한다.
만약 completionRecord .[[Value]] 가
empty 가 아니라면, ? completionRecord 를 반환한다.
완료 레코드 {
[[Type]] :
completionRecord .[[Type]] , [[Value]] : value , [[Target]] : completionRecord .[[Target]] }를 반환한다.
6.2.5 Reference Record 명세 타입
Reference Record 타입은 delete,
typeof, 대입 연산자, super 키워드 및 기타 언어 기능의 동작을 설명하는 데 사용된다.
예를 들어, 대입의 왼쪽 피연산자는 Reference Record를 생성해야 한다.
Reference Record는 해석된 이름 또는 (아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 그 필드는 표 8 에 정의되어 있다.
표 8: Reference Record
필드
Reference Record를 다루기 위해 이 명세에서 다음 추상 연산 들이 사용된다:
6.2.5.1 IsPropertyReference ( V )
추상 연산 IsPropertyReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[Base]] 가
unresolvable 이면 false 를 반환한다.
V .[[Base]] 가 Environment Record 이면
false 를, 아니면 true 를 반환한다.
6.2.5.2 IsUnresolvableReference ( V )
추상 연산 IsUnresolvableReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[Base]] 가
unresolvable 이면 true 를, 아니면
false 를 반환한다.
6.2.5.3 IsSuperReference ( V )
추상 연산 IsSuperReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[ThisValue]] 가 empty 가
아니면 true 를, 아니면 false 를 반환한다.
6.2.5.4 IsPrivateReference ( V )
추상 연산 IsPrivateReference는 인수 V ( Reference Record )를
받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
V .[[ReferencedName]] 이 Private
Name 이면 true 를, 아니면
false 를 반환한다.
6.2.5.5 GetValue ( V )
추상 연산 GetValue는 인수 V ( Reference
Record 또는 ECMAScript 언어 값
)를 받아 특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 비정상 완료 중 하나를 반환한다.
호출 시 다음 단계를 수행한다:
V 가 Reference
Record 가 아니면 V 를 반환한다.
IsUnresolvableReference (V )
가 true 이면 ReferenceError 예외를 throw한다.
IsPropertyReference (V )
가 true 이면, 다음을 수행한다:
baseObj 를 ? ToObject (V .[[Base]] )로 설정한다.
IsPrivateReference (V )
가 true 이면, 다음을 수행한다:
? PrivateGet (baseObj ,
V .[[ReferencedName]] )를 반환한다.
V .[[ReferencedName]] 이 property
key 가 아니면, 다음을 수행한다:
V .[[ReferencedName]] 을
? ToPropertyKey (V .[[ReferencedName]] )로 설정한다.
? baseObj .[[Get]] (V .[[ReferencedName]] , GetThisValue (V ))를
반환한다.
그 외의 경우,
base 를 V .[[Base]] 로 설정한다.
Assert : base 는 Environment Record 여야
한다.
? base .GetBindingValue (V .[[ReferencedName]] , V .[[Strict]] )를 반환한다 (9.1 참고).
참고
3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과
ordinary
object 의 [[Get]] 내부 메서드 외부에서는 접근할 수
없다. 구현체는 실제 객체 생성을 생략할 수 있다.
6.2.5.6 PutValue ( V , W )
추상 연산 PutValue는 인수 V ( Reference
Record 또는 ECMAScript 언어 값
)와 W ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 비정상
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
V 가 Reference
Record 가 아니면 ReferenceError 예외를 throw한다.
IsUnresolvableReference (V )
가 true 이면, 다음을 수행한다:
V .[[Strict]] 가 true 이면
ReferenceError 예외를 throw한다.
globalObj 를 GetGlobalObject ()로 설정한다.
? Set (globalObj ,
V .[[ReferencedName]] , W ,
false )를 수행한다.
unused 를 반환한다.
IsPropertyReference (V )
가 true 이면, 다음을 수행한다:
baseObj 를 ? ToObject (V .[[Base]] )로 설정한다.
IsPrivateReference (V )
가 true 이면, 다음을 수행한다:
? PrivateSet (baseObj ,
V .[[ReferencedName]] ,
W )를 반환한다.
V .[[ReferencedName]] 이 property
key 가 아니면, 다음을 수행한다:
V .[[ReferencedName]] 을
? ToPropertyKey (V .[[ReferencedName]] )로 설정한다.
succeeded 를 ? baseObj .[[Set]] (V .[[ReferencedName]] , W , GetThisValue (V ))로
설정한다.
succeeded 가 false 이고 V .[[Strict]] 가 true 이면
TypeError 예외를 throw한다.
unused 를 반환한다.
그 외의 경우,
base 를 V .[[Base]] 로 설정한다.
Assert : base 는 Environment Record 여야
한다.
? base .SetMutableBinding (V .[[ReferencedName]] , W , V .[[Strict]] )를 반환한다 (9.1 참고).
참고
3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과
ordinary
object 의 [[Set]] 내부 메서드 외부에서는 접근할 수
없다. 구현체는 실제 객체 생성을 생략할 수 있다.
6.2.5.7 GetThisValue ( V )
추상 연산 GetThisValue는 인수 V ( Reference Record )를
받아 ECMAScript 언어 값 을 반환한다. 호출 시 다음
단계를 수행한다:
Assert :
IsPropertyReference (V )
가 true 임을 보장한다.
IsSuperReference (V )
가 true 이면 V .[[ThisValue]] 를,
아니면 V .[[Base]] 를 반환한다.
6.2.5.8 InitializeReferencedBinding ( V , W
)
추상 연산 InitializeReferencedBinding은 인수 V ( Reference Record )와
W ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 비정상
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
IsUnresolvableReference (V )
가 false 임을 보장한다.
base 를 V .[[Base]] 로 설정한다.
Assert :
base 는 Environment Record 여야 한다.
? base .InitializeBinding(V .[[ReferencedName]] , W )를 반환한다.
6.2.5.9 MakePrivateReference ( baseValue ,
privateIdentifier )
추상 연산 MakePrivateReference는 인수 baseValue ( ECMAScript 언어 값 )와
privateIdentifier (문자열)을 받아 Reference Record 를
반환한다. 호출 시 다음 단계를 수행한다:
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 설정한다.
Assert :
privateEnv 가 null 이 아님을 보장한다.
privateName 을 ResolvePrivateIdentifier (privateEnv ,
privateIdentifier )로 설정한다.
다음과 같은 Reference
Record 를 반환한다: { [[Base]] :
baseValue , [[ReferencedName]] :
privateName , [[Strict]] :
true , [[ThisValue]] :
empty }.
6.2.6 프로퍼티 디스크립터 명세 타입
Property Descriptor 타입은 객체 프로퍼티 속성의 조작 및
구체화(reification)를 설명하는 데 사용된다. Property Descriptor는 0개 이상의 필드를 가진 Record 이며, 각 필드의 이름은 속성
이름이고 값은 6.1.7.1 에 명시된 해당 속성 값이다. 이 명세 내에서 리터럴
Property Descriptor 레코드의 태그로 사용되는 스키마 이름은 “PropertyDescriptor”이다.
Property Descriptor 값은 특정 필드의 존재 또는 사용에 따라 데이터 프로퍼티 디스크립터와 접근자 프로퍼티 디스크립터로 더 분류될 수 있다. 데이터 프로퍼티
디스크립터는 [[Value]] 또는 [[Writable]] 라는 이름의 필드가 포함된
것이다. 접근자 프로퍼티 디스크립터는 [[Get]] 또는 [[Set]] 라는 이름의
필드가 포함된 것이다. 어떤 Property Descriptor도 [[Enumerable]] 와 [[Configurable]] 라는 이름의 필드를 가질 수 있다. Property Descriptor 값은 데이터 프로퍼티
디스크립터이면서 접근자 프로퍼티 디스크립터일 수는 없지만, 둘 다 아닐 수는 있다(이 경우 일반 프로퍼티 디스크립터이다). 완전히 채워진
Property Descriptor 는 접근자 프로퍼티 디스크립터 또는 데이터 프로퍼티 디스크립터 중 하나이면서 표 3 에 명시된 모든 해당 필드를 가진 것이다.
Property Descriptor 값을 다루기 위해 이 명세에서는 다음 추상 연산 들이 사용된다:
6.2.6.1 IsAccessorDescriptor ( Desc )
추상 연산 IsAccessorDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Desc 에 [[Get]] 필드가 있으면 true 를
반환한다.
Desc 에 [[Set]] 필드가 있으면 true 를
반환한다.
false 를 반환한다.
6.2.6.2 IsDataDescriptor ( Desc )
추상 연산 IsDataDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Desc 에 [[Value]] 필드가 있으면 true 를
반환한다.
Desc 에 [[Writable]] 필드가 있으면
true 를 반환한다.
false 를 반환한다.
6.2.6.3 IsGenericDescriptor ( Desc )
추상 연산 IsGenericDescriptor는 인수 Desc ( Property
Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
IsAccessorDescriptor (Desc )
가 true 이면 false 를 반환한다.
IsDataDescriptor (Desc )
가 true 이면 false 를 반환한다.
true 를 반환한다.
6.2.6.4 FromPropertyDescriptor ( Desc )
추상 연산 FromPropertyDescriptor는 인수 Desc ( Property
Descriptor 또는 undefined )를 받아 객체 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
Desc 가 undefined 이면 undefined 를 반환한다.
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
설정한다.
Assert :
obj 는 자체 프로퍼티가 없는 확장 가능한 ordinary object 여야 한다.
Desc 에 [[Value]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"value" , Desc .[[Value]] )를 수행한다.
Desc 에 [[Writable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"writable" , Desc .[[Writable]] )를 수행한다.
Desc 에 [[Get]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"get" , Desc .[[Get]] )를
수행한다.
Desc 에 [[Set]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"set" , Desc .[[Set]] )를
수행한다.
Desc 에 [[Enumerable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"enumerable" , Desc .[[Enumerable]] )를 수행한다.
Desc 에 [[Configurable]] 필드가 있으면, 다음을 수행한다:
! CreateDataPropertyOrThrow (obj ,
"configurable" , Desc .[[Configurable]] )를 수행한다.
obj 를 반환한다.
6.2.6.5 ToPropertyDescriptor ( Obj )
추상 연산 ToPropertyDescriptor는 인수 Obj ( ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
Property
Descriptor 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
Obj 가 객체가 아니면 , TypeError
예외를 throw한다.
desc 를 처음에는 필드가 없는 새로운 Property
Descriptor 로 설정한다.
hasEnumerable 을 ? HasProperty (Obj ,
"enumerable" )로 설정한다.
hasEnumerable 이 true 이면, 다음을 수행한다:
enumerable 을 ToBoolean (? Get (Obj ,
"enumerable" ))로 설정한다.
desc .[[Enumerable]] 에
enumerable 을 할당한다.
hasConfigurable 을 ? HasProperty (Obj ,
"configurable" )로 설정한다.
hasConfigurable 이 true 이면, 다음을 수행한다:
configurable 을 ToBoolean (? Get (Obj ,
"configurable" ))로 설정한다.
desc .[[Configurable]] 에
configurable 을 할당한다.
hasValue 를 ? HasProperty (Obj ,
"value" )로 설정한다.
hasValue 가 true 이면, 다음을 수행한다:
value 를 ? Get (Obj ,
"value" )로 설정한다.
desc .[[Value]] 에 value 를 할당한다.
hasWritable 을 ? HasProperty (Obj ,
"writable" )로 설정한다.
hasWritable 이 true 이면, 다음을 수행한다:
writable 을 ToBoolean (? Get (Obj ,
"writable" ))로 설정한다.
desc .[[Writable]] 에 writable 을
할당한다.
hasGet 을 ? HasProperty (Obj ,
"get" )로 설정한다.
hasGet 이 true 이면, 다음을 수행한다:
getter 를 ? Get (Obj ,
"get" )로 설정한다.
IsCallable (getter )
가 false 이고 getter 가
undefined 가 아니면 TypeError 예외를 throw한다.
desc .[[Get]] 에 getter 를 할당한다.
hasSet 을 ? HasProperty (Obj ,
"set" )로 설정한다.
hasSet 이 true 이면, 다음을 수행한다:
setter 를 ? Get (Obj ,
"set" )로 설정한다.
IsCallable (setter )
가 false 이고 setter 가
undefined 가 아니면 TypeError 예외를 throw한다.
desc .[[Set]] 에 setter 를 할당한다.
desc 에 [[Get]] 필드가 있거나 desc 에 [[Set]] 필드가 있으면, 다음을 수행한다:
desc 에 [[Value]] 필드가 있거나 desc 에
[[Writable]] 필드가 있으면 TypeError
예외를 throw한다.
desc 를 반환한다.
6.2.6.6 CompletePropertyDescriptor ( Desc )
추상 연산 CompletePropertyDescriptor는 인수 Desc ( Property
Descriptor )를 받아 unused 를 반환한다. 호출 시 다음 단계를
수행한다:
like 를 Record { [[Value]] : undefined , [[Writable]] : false , [[Get]] : undefined , [[Set]] : undefined , [[Enumerable]] : false , [[Configurable]] : false }로 설정한다.
IsGenericDescriptor (Desc )가
true 이거나 IsDataDescriptor (Desc )가
true 이면, 다음을 수행한다:
Desc 에 [[Value]] 필드가 없으면
Desc .[[Value]] 를 like .[[Value]] 로 설정한다.
Desc 에 [[Writable]] 필드가 없으면
Desc .[[Writable]] 를 like .[[Writable]] 로 설정한다.
그 외의 경우,
Desc 에 [[Get]] 필드가 없으면
Desc .[[Get]] 를 like .[[Get]] 로 설정한다.
Desc 에 [[Set]] 필드가 없으면
Desc .[[Set]] 를 like .[[Set]] 로 설정한다.
Desc 에 [[Enumerable]] 필드가 없으면
Desc .[[Enumerable]] 를 like .[[Enumerable]] 로 설정한다.
Desc 에 [[Configurable]] 필드가 없으면
Desc .[[Configurable]] 를 like .[[Configurable]] 로 설정한다.
unused 를 반환한다.
6.2.7 환경 레코드 명세 타입
Environment Record 타입은 중첩 함수와 블록에서의 이름 해석
동작을 설명하는 데 사용된다. 이 타입과 그에 대한 연산들은 9.1 에 정의되어 있다.
6.2.8 추상 클로저 명세 타입
Abstract Closure 명세 타입은 알고리즘 단계와 값들의 집합을 함께
참조하는 데 사용된다. Abstract Closure는 메타값이며, closure (arg1 , arg2 )와 같은
함수 호출 방식으로 호출된다. 추상
연산 과 마찬가지로, 호출 시 Abstract Closure에 명시된 알고리즘 단계를 수행한다.
Abstract Closure를 생성하는 알고리즘 단계에서는 "capture"라는 동사 뒤에 별칭(alias) 목록을 사용해 값을 캡처한다. Abstract Closure가
생성될 때, 각 별칭에 연결된 값을 그 시점에 캡처한다. Abstract Closure가 호출될 때 수행할 알고리즘을 명시하는 단계에서는, 캡처된 각 값은 해당 별칭을 통해
참조된다.
Abstract Closure가 Completion Record 를 반환하는
경우, 해당 Completion Record 는
정상 완료 또는 throw 완료 여야 한다.
Abstract Closure는 다음 예시처럼 다른 알고리즘의 일부로 인라인으로 생성된다.
addend 를 41로 한다.
closure 를 매개변수 (x )를 가지며 addend 를 캡처하고, 호출 시 다음 단계를 수행하는
새로운 Abstract Closure 로 한다:
x + addend 를 반환한다.
val 을 closure (1)로 한다.
Assert :
val 은 42이다.
6.2.9 데이터 블록
Data Block 명세 타입은 구분되는 변경 가능한 바이트 크기(8비트) 정수 값들의
시퀀스를 설명하는 데 사용된다. byte value 는 정수 이며, 구간 [0,
255] 에 속한다. Data Block 값은 고정된 개수의 바이트로 생성되며, 각 바이트의 초기값은 0이다.
이 명세 내 표기상의 편의를 위해, 배열과 유사한 문법을 사용해 Data Block 값의 개별 바이트에 접근할 수 있다. 이 표기법은 Data Block 값을 0부터 시작하는
정수-인덱스 바이트 시퀀스로 나타낸다. 예를 들어, db 가 5바이트 Data Block 값이면
db [2]는 세 번째 바이트를 의미한다.
여러 agent 에서 동시에 참조할 수 있는
메모리에 위치한 데이터 블록은 Shared Data Block 으로
지정된다. Shared Data Block은 정체성(동등성 판단 목적)을 주소와 무관하게 가진다: 이는 프로세스의 가상 주소가 아니라 그 블록이 대표하는
메모리 위치 집합에 묶여 있다. 두 데이터 블록이 동일하다는 것은 그들이 포함하는 위치 집합이 동일할 때뿐이다. 그렇지 않으면 서로 다르며, 각자 위치 집합의 교집합은
없다. 마지막으로 Shared Data Block은 일반 Data Block과 구별된다.
Shared Data Block의 의미는 Shared Data Block 이벤트 및 메모리 모델 에
의해 정의된다. 아래 추상 연산 들은 Shared Data Block 이벤트 를 도입하며, 평가 의미와
메모리 모델의 이벤트 의미를 연결하는 인터페이스 역할을 한다. 이벤트들은 candidate execution 을 구성하며,
메모리
모델 이 필터로 작동한다. 전체 의미는 메모리 모델 를 참조할 것.
Shared Data Block 이벤트 는 Record 로 모델링되며, 메모리 모델 에
정의되어 있다.
Data Block 값을 다루기 위해 이 명세에서는 다음 추상
연산 들이 사용된다:
6.2.9.1 CreateByteDataBlock ( size )
추상 연산 CreateByteDataBlock은 size (음이 아닌 정수 )를 인수로 받아, 특정 값을 포함하는 정상 완료
Data
Block 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
size > 253 - 1이면 RangeError 예외를 throw한다.
db 를 size 바이트로 구성된 새로운 Data Block 값으로 한다. 만약
그런 Data
Block 의 생성을 할 수 없는 경우 RangeError 예외를
throw한다.
db 의 모든 바이트를 0으로 설정한다.
db 를 반환한다.
6.2.9.2 CreateSharedByteDataBlock ( size )
추상 연산 CreateSharedByteDataBlock은 size (음이 아닌 정수 )
를 인수로 받아, 특정 값을 포함하는 정상 완료
Shared Data
Block 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
db 를 size 바이트로 구성된 새로운 Shared Data Block 값으로
한다. 그런 Shared Data Block 의 생성을 할 수 없는 경우
RangeError 예외를 throw한다.
execution 을 주변 agent 의 Agent
Record 의 [[CandidateExecution]] 필드로
한다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로 한다.
zero 를 « 0 »으로 한다.
db 의 각 인덱스 i 에 대해, 다음을 수행한다:
WriteSharedMemory
{ [[Order]] : init , [[NoTear]] : true , [[Block]] : db , [[ByteIndex]] : i , [[ElementSize]] : 1, [[Payload]] : zero }를
eventsRecord .[[EventList]] 에 추가한다.
db 를 반환한다.
6.2.9.3 CopyDataBlockBytes ( toBlock ,
toIndex , fromBlock , fromIndex , count )
추상 연산 CopyDataBlockBytes는 인수 toBlock ( Data Block 또는 Shared Data
Block ), toIndex (음이 아닌 정수 ), fromBlock ( Data
Block 또는 Shared Data Block ), fromIndex (음이
아닌 정수 ),
count (음이 아닌 정수 )를 받아 unused 를 반환한다. 호출 시 다음
단계를 수행한다:
Assert :
fromBlock 과 toBlock 은 서로 다른 값이어야 한다.
fromSize 를 fromBlock 의 바이트 수로 한다.
Assert :
fromIndex + count ≤ fromSize 여야 한다.
toSize 를 toBlock 의 바이트 수로 한다.
Assert :
toIndex + count ≤ toSize 여야 한다.
count > 0인 동안 반복한다:
fromBlock 이 Shared Data Block 이면, 다음을
수행한다:
execution 을 주변
agent 의 Agent
Record 의 [[CandidateExecution]] 필드로 한다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events
Record 로 한다.
bytes 를 List 로,
유일한 요소는 비결정적으로 선택된 byte
value 로 한다.
참고: 구현에서는 bytes 가 하드웨어의 비원자적 읽기 명령의 결과일 수 있다. 이 비결정성은
메모리 모델 의 의미 처방으로, 약한
일관성을 가진 하드웨어의 관찰 가능한 동작을 설명한다.
readEvent 를 ReadSharedMemory
{ [[Order]] :
unordered , [[NoTear]] :
true , [[Block]] :
fromBlock , [[ByteIndex]] :
fromIndex , [[ElementSize]] :
1 }로 한다.
readEvent 를 eventsRecord .[[EventList]] 에 추가한다.
Chosen Value
Record { [[Event]] :
readEvent , [[ChosenValue]] :
bytes }를 execution .[[ChosenValues]] 에 추가한다.
toBlock 이 Shared Data
Block 이면, 다음을 수행한다:
WriteSharedMemory
{ [[Order]] :
unordered , [[NoTear]] : true ,
[[Block]] : toBlock , [[ByteIndex]] : toIndex ,
[[ElementSize]] : 1, [[Payload]] : bytes }
를 eventsRecord .[[EventList]] 에 추가한다.
그 외의 경우,
toBlock [toIndex ]에 bytes [0]을
설정한다.
그 외의 경우,
Assert : toBlock 은
Shared Data Block 이
아니어야 한다.
toBlock [toIndex ]에
fromBlock [fromIndex ]를 설정한다.
toIndex 를 toIndex + 1로 한다.
fromIndex 를 fromIndex + 1로 한다.
count 를 count - 1로 한다.
unused 를 반환한다.
6.2.10 PrivateElement 명세 타입
PrivateElement 타입은 private 클래스 필드, 메서드, 접근자의 명세에 사용되는 Record 이다. Property Descriptor 는
private 요소에 사용되지 않지만, private 필드는 비구성, 비열거, 쓰기 가능한 데이터 프로퍼티 와 유사하게 동작하고, private 메서드는
비구성, 비열거, 쓰기 불가능한 데이터 프로퍼티 와 유사하며, private 접근자는 비구성, 비열거 접근자 프로퍼티 와
유사하게 동작한다.
PrivateElement 타입의 값은 Record 값이며, 그 필드는
표 9 에 정의되어 있다. 이러한 값은 PrivateElements 라 한다.
표 9: PrivateElement
필드
필드 이름
해당 필드가 존재하는 [[Kind]] 필드의 값
값
의미
[[Key]]
모두
Private Name
필드, 메서드, 접근자의 이름.
[[Kind]]
모두
field , method , 또는
accessor
요소의 종류.
[[Value]]
field 및 method
ECMAScript 언어 값
필드의 값.
[[Get]]
accessor
함수 객체 또는
undefined
private 접근자의 getter.
[[Set]]
accessor
함수 객체 또는
undefined
private 접근자의 setter.
6.2.11 ClassFieldDefinition Record 명세 타입
ClassFieldDefinition 타입은 클래스 필드 명세에 사용되는 Record 이다.
ClassFieldDefinition 타입의 값은 Record 값이며,
그 필드는 표 10 에 정의되어 있다. 이러한 값은 ClassFieldDefinition Record 라 한다.
표 10: ClassFieldDefinition
Record 필드
필드 이름
값
의미
[[Name]]
Private Name , 문자열, 또는
심볼
필드의 이름.
[[Initializer]]
ECMAScript 함수 객체 또는
empty
해당하는 경우, 필드의 이니셜라이저.
6.2.12 Private Name
프라이빗 네임 명세 타입은
전역적으로 고유한 값을 설명하는 데 사용됩니다 (다른 프라이빗 네임과 구별되지 않는 경우에도 서로 다릅니다)
이 값은 프라이빗 클래스 요소(필드, 메서드 또는 접근자)의 키를 나타냅니다.
각 프라이빗 네임은 변경할 수 없는 [[Description]] 내부 슬롯을 가지며,
이는 문자열 입니다.
프라이빗 네임은 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd 를 사용하여
어떤 ECMAScript 객체에든 설치될 수 있으며, PrivateGet
및 PrivateSet 을 사용하여 읽거나 쓸 수 있습니다.
6.2.13 ClassStaticBlockDefinition 레코드 명세 타입
ClassStaticBlockDefinition
Record 는 클래스 정적 초기화 블록의 실행 가능한 코드를 캡슐화하는 데 사용되는 Record 값이다.
ClassStaticBlockDefinition Record는 표 11 에 나열된 필드를 가진다.
표 11: ClassStaticBlockDefinition
Record 필드
필드 이름
값
의미
[[BodyFunction]]
ECMAScript 함수 객체
클래스의 정적 초기화 시 호출되는 함수 객체
7 추상 연산
이 연산들은 ECMAScript 언어의 일부가 아니며, 오직 ECMAScript 언어 의미의 명세를 돕기 위해 여기에 정의되어 있다. 다른, 더 특화된 추상 연산 들은 이 명세 전반에 걸쳐 정의되어
있다.
7.1 타입 변환
ECMAScript 언어는 필요에 따라 암시적으로 자동 타입 변환을 수행한다. 특정 구문의 의미를 명확히 하기 위해 일련의 변환 추상 연산 을 정의하는 것이 유용하다.
변환 추상 연산 들은 다형적이며, 어떤
ECMAScript 언어 타입 의 값도 인수로 받을 수 있다.
하지만 다른 명세 타입은 이 연산들과 함께 사용되지 않는다.
BigInt 타입 은 ECMAScript 언어에서
암시적 변환을 가지지 않는다. 프로그래머는 다른 타입의 값을 변환하려면 BigInt를 명시적으로 호출해야 한다.
7.1.1 ToPrimitive ( input [ , preferredType ]
)
추상 연산 ToPrimitive는 인수 input (ECMAScript 언어 값 )과 선택적
인수 preferredType (string 또는
number )을 받아, 특정 값을 포함하는 정상
완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
input 인수를 Object 타입이 아닌 값으로 변환한다. 만약 객체가 둘 이상의 원시 타입으로 변환
가능하다면, 선택적 힌트 preferredType 을 사용해 그 타입을 우선시할 수 있다. 호출 시 다음 단계를 수행한다:
input 이 객체이면 , 다음을 수행한다:
exoticToPrim 를 ? GetMethod (input , %Symbol.toPrimitive% )로 한다.
exoticToPrim 이 undefined 가 아니면, 다음을 수행한다:
preferredType 이 없으면, 다음을 수행한다:
hint 를 "default" 로 한다.
그 외 preferredType 이 string 이면, 다음을 수행한다:
hint 를 "string" 로 한다.
그 외의 경우,
Assert :
preferredType 이 number 임을 보장한다.
hint 를 "number" 로 한다.
result 를 ? Call (exoticToPrim ,
input , « hint »)로 한다.
result 가 객체가 아니면 ,
result 를 반환한다.
TypeError 예외를 throw한다.
preferredType 이 없으면 preferredType 을
number 로 한다.
? OrdinaryToPrimitive (input ,
preferredType )를 반환한다.
input 을 반환한다.
참고
ToPrimitive가 힌트 없이 호출될 때 기본적으로 number 힌트로 동작한다. 그러나 객체는 %Symbol.toPrimitive% 메서드를 정의함으로써 이
동작을 오버라이드할 수 있다. 이 명세에서 정의된 객체 중 Date( 21.4.4.45 참고 )와
Symbol 객체( 20.4.3.5 참고 )만이
기본 ToPrimitive 동작을 오버라이드한다. Date는 힌트가 없을 때 string 으로 동작한다.
7.1.1.1 OrdinaryToPrimitive ( O , hint )
추상 연산 OrdinaryToPrimitive는 인수 O (객체)와 hint (string
또는 number )를 받아, 특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
hint 가 string 이면, 다음을 수행한다:
methodNames 를 « "toString" ,
"valueOf" »로 한다.
그 외의 경우,
methodNames 를 « "valueOf" ,
"toString" »로 한다.
methodNames 의 각 요소 name 에 대해, 다음을 수행한다:
method 를 ? Get (O ,
name )로 한다.
IsCallable (method )
가 true 이면, 다음을 수행한다:
result 를 ? Call (method ,
O )로 한다.
result 가 객체가
아니면 , result 를 반환한다.
TypeError 예외를 throw한다.
7.1.2 ToBoolean ( argument )
추상 연산 ToBoolean은 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 를 Boolean 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 Boolean이면 ,
argument 를 반환한다.
argument 가 undefined , null ,
+0 𝔽 , -0 𝔽 ,
NaN , 0 ℤ , 또는 빈 문자열 중 하나이면
false 를 반환한다.
참고: 이 단계는 B.3.6.1 절에서 대체된다.
true 를 반환한다.
7.1.3 ToNumeric ( value )
추상 연산 ToNumeric은 인수 value (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Number
또는 BigInt, 또는 throw 완료 를 반환한다. 이 연산은
value 를 Number 또는 BigInt로 변환해 반환한다. 호출 시 다음 단계를 수행한다:
primValue 를 ? ToPrimitive (value ,
number )로 한다.
primValue 가 BigInt이면 ,
primValue 를 반환한다.
? ToNumber (primValue )를 반환한다.
7.1.4 ToNumber ( argument )
추상 연산 ToNumber는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Number
또는 throw 완료 를 반환한다. 이 연산은
argument 를 Number 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 Number이면 ,
argument 를 반환한다.
argument 가 Symbol 또는 BigInt이면, TypeError 예외를 throw한다.
argument 가 undefined 이면 NaN 을 반환한다.
argument 가 null 또는 false 이면
+0 𝔽 을 반환한다.
argument 가 true 이면
1 𝔽 을 반환한다.
argument 가 문자열이면 ,
StringToNumber (argument )를
반환한다.
Assert :
argument 가 객체임 을 보장한다.
primValue 를 ? ToPrimitive (argument ,
number )로 한다.
Assert :
primValue 가 객체가 아님 을 보장한다.
? ToNumber (primValue )를 반환한다.
7.1.4.1 문자열 타입에 적용된 ToNumber
추상 연산 StringToNumber 는 다음 문법을 사용해 문자열 값을 Number
값으로 변환하는 방법을 명세한다.
구문
StringNumericLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar
:::
WhiteSpace
LineTerminator
StrNumericLiteral
:::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral
:::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
위에 명시적으로 정의되지 않은 모든 문법 기호는 숫자 리터럴에 대한 어휘 문법(12.9.3 )에서 사용된 정의를
따른다.
참고
7.1.4.1.1 StringToNumber ( str )
추상 연산 StringToNumber는 인수 str (문자열)을 받아 Number를 반환한다. 호출 시 다음 단계를 수행한다:
literal 을 ParseText (str , StringNumericLiteral )로
한다.
literal 이 오류의
리스트 이면 NaN 을 반환한다.
literal 의 StringNumericValue 를
반환한다.
7.1.4.1.2 런타임 의미: StringNumericValue
구문 지시
연산 StringNumericValue는 인수를 받지 않고 Number를 반환한다.
참고
StringNumericLiteral 을
Number 값으로 변환하는 과정은 전체적으로 NumericValue 가 NumericLiteral 에
대해 결정되는 과정( 12.9.3 참고 )과 유사하지만,
세부 사항은 약간 다르다.
다음 생성 규칙별로 조각(piecewise) 정의된다:
StringNumericLiteral
::: StrWhiteSpace opt
+0 𝔽 을 반환한다.
StringNumericLiteral
:::
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrNumericLiteral 의 StringNumericValue 를
반환한다.
StrNumericLiteral
::: NonDecimalIntegerLiteral
𝔽 (MV of
NonDecimalIntegerLiteral )를
반환한다.
StrDecimalLiteral
:::
-
StrUnsignedDecimalLiteral
a 를 StrUnsignedDecimalLiteral 의
StringNumericValue 로
한다.
a 가 +0 𝔽 이면
-0 𝔽 을 반환한다.
-a 를 반환한다.
StrUnsignedDecimalLiteral
::: Infinity
+∞ 𝔽 을 반환한다.
StrUnsignedDecimalLiteral
:::
DecimalDigits
.
DecimalDigits opt
ExponentPart opt
첫 번째 DecimalDigits 의 MV를 a 로
한다.
두 번째 DecimalDigits 가 존재하면, 다음을 수행한다:
두 번째 DecimalDigits 의 MV를
b 로 한다.
두 번째 DecimalDigits 의 코드 포인트
개수를 n 으로 한다.
그 외의 경우,
b 를 0으로 한다.
n 을 0으로 한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
RoundMVResult ((a +
(b × 10-n )) × 10e )를 반환한다.
StrUnsignedDecimalLiteral
:::
.
DecimalDigits
ExponentPart opt
DecimalDigits 의 MV를 b 로
한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
DecimalDigits 의 코드 포인트 개수를
n 으로 한다.
RoundMVResult (b ×
10e - n )를 반환한다.
StrUnsignedDecimalLiteral
:::
DecimalDigits
ExponentPart opt
DecimalDigits 의 MV를 a 로
한다.
ExponentPart 가
존재하면, e 를 ExponentPart 의 MV로 한다. 그렇지 않으면
e 를 0으로 한다.
RoundMVResult (a ×
10e )를 반환한다.
7.1.4.1.3 RoundMVResult ( n )
추상 연산 RoundMVResult는 인수 n (수학적 값 )을 받아 Number를 반환한다.
이 연산은 n 을 구현 정의 방식으로 Number로 변환한다. 이 추상
연산에서, 숫자는 0이 아니거나 왼쪽에 0이 아닌 숫자가 있고 오른쪽에도 0이 아닌 숫자가 있을 때 유효 숫자(significant)로 간주한다. 이 추상
연산에서, "수학적 값 이 나타내는" 어떤 수학적
값 의 표현은 "수학적 값 의 10진수 표현"의 역이다. 호출 시 다음 단계를
수행한다:
n 의 10진수 표현이 20자리 이하의 유효 숫자를 가지면 𝔽 (n )를 반환한다.
option1 을 n 의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾼 결과가 나타내는
수학적 값 로 한다.
option2 를 n 의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾸고, 그 20번째
자릿수를(필요하다면 올림하면서) 1 증가시킨 결과가 나타내는 수학적 값 로 한다.
chosen 을 구현 정의 방식으로
option1 또는 option2 중에서 선택한다.
𝔽 (chosen )를 반환한다.
7.1.5 ToIntegerOrInfinity ( argument )
추상 연산 ToIntegerOrInfinity는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수 , +∞, 또는 -∞, 또는
throw 완료 를 반환한다. 이 연산은
argument 를 Number 값의 소수 부분을 잘라낸 정수 로 변환하거나, 해당 Number 값이 무한대일 경우 +∞ 또는 -∞로 변환한다. 호출 시 다음
단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 NaN ,
+0 𝔽 , 또는 -0 𝔽 중 하나이면 0을
반환한다.
number 가 +∞ 𝔽 이면 +∞를 반환한다.
number 가 -∞ 𝔽 이면 -∞를 반환한다.
truncate (ℝ (number ))를 반환한다.
참고
𝔽 (ToIntegerOrInfinity(
x ))는 어떤
x 에
대해서도
-0 𝔽 을 반환하지 않는다. 소수 부분의 절단은
x 를
수학적
값 으로 변환한 후 수행된다.
7.1.6 ToInt32 ( argument )
추상 연산 ToInt32는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 232 개 중 [-231 ,
231 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int32bit 를 int modulo 232 로 한다.
int32bit ≥ 231 이면 𝔽 (int32bit - 232 )를, 아니면
𝔽 (int32bit )를
반환한다.
참고
위 ToInt32 정의에 따라:
ToInt32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
ToInt32(ToUint32 (x ))는 모든
x 에 대해 ToInt32(x )와 같다. (+∞ 𝔽 와
-∞ 𝔽 이 +0 𝔽 으로 매핑되는 것은 이
속성을 보존하기 위함이다.)
ToInt32는 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.7 ToUint32 ( argument )
추상 연산 ToUint32는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 232 개 중 [+0,
232 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int32bit 를 int modulo 232 로 한다.
𝔽 (int32bit )를 반환한다.
참고
위 ToUint32 정의에 따라:
5 단계가 ToUint32와 ToInt32 의 유일한
차이점이다.
ToUint32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
ToUint32(ToInt32 (x ))는 모든 x 에
대해 ToUint32(x )와 같다. (+∞ 𝔽 와
-∞ 𝔽 이 +0 𝔽 으로 매핑되는 것은 이
속성을 보존하기 위함이다.)
ToUint32는 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.8 ToInt16 ( argument )
추상 연산 ToInt16은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 216 개 중 [-215 ,
215 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int16bit 를 int modulo 216 로 한다.
int16bit ≥ 215 이면 𝔽 (int16bit - 216 )를, 아니면
𝔽 (int16bit )를
반환한다.
7.1.9 ToUint16 ( argument )
추상 연산 ToUint16은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 216 개 중 [+0,
216 -1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int16bit 를 int modulo 216 로 한다.
𝔽 (int16bit )를
반환한다.
참고
위 ToUint16 정의에 따라:
4 단계의 216 대입만이 ToUint32 와
ToUint16의 유일한 차이점이다.
ToUint16은 -0 𝔽 을 +0 𝔽 으로
매핑한다.
7.1.10 ToInt8 ( argument )
추상 연산 ToInt8은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 28 개 중 [-128,
127] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int8bit 를 int modulo 28 로 한다.
int8bit ≥ 27 이면 𝔽 (int8bit - 28 )를, 아니면 𝔽 (int8bit )를 반환한다.
7.1.11 ToUint8 ( argument )
추상 연산 ToUint8은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 정수 Number 28 개 중 [+0,
255] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 유한 이 아니거나 number 가
+0 𝔽 또는 -0 𝔽 이면
+0 𝔽 을 반환한다.
int 를 truncate (ℝ (number ))로 한다.
int8bit 를 int modulo 28 로 한다.
𝔽 (int8bit )를
반환한다.
7.1.12 ToUint8Clamp ( argument )
추상 연산 ToUint8Clamp는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 28 개의 정수 Number 값 중 [+0,
255] 구간 내로 클램프하고 반올림한다. 호출 시 다음 단계를 수행한다:
number 를 ? ToNumber (argument )로 한다.
number 가 NaN 이면
+0 𝔽 을 반환한다.
mv 를 number의 확장 수학적 값 으로 한다.
clamped 를 mv를 0과
255 사이로 클램프 한 결과로 한다.
f 를 floor (clamped )로 한다.
clamped < f + 0.5이면 𝔽 (f )를 반환한다.
clamped > f + 0.5이면 𝔽 (f + 1)을 반환한다.
f 가 짝수면 𝔽 (f )를, 아니면 𝔽 (f + 1)을 반환한다.
참고
다른 대부분의 ECMAScript 정수 변환 연산과 달리, ToUint8Clamp는 소수 값을 절단(truncate)하지
않고 반올림(round)한다. 또한 "홀수 올림(round half up)"이 아닌 "짝수 쪽으로 반올림(round half to even)" 타이브레이킹을
사용한다. 이는 Math.round 와 다르다.
7.1.13 ToBigInt ( argument )
추상 연산 ToBigInt는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 BigInt 값으로 변환하거나, Number로의 암시적 변환이 필요한 경우 예외를 던진다. 호출 시 다음 단계를 수행한다:
prim 을 ? ToPrimitive (argument ,
number )로 한다.
prim 이 표 12 에서 어떤 값에 해당하는지에 따라 결과를 반환한다.
표 12: BigInt 변환
인수 타입
결과
Undefined
TypeError 예외를 throw한다.
Null
TypeError 예외를 throw한다.
Boolean
prim 이 true 면 1n,
false 면 0n을 반환한다.
BigInt
prim 을 반환한다.
Number
TypeError 예외를 throw한다.
String
n 을 StringToBigInt (prim )로
한다.
n 이 undefined 면
SyntaxError 예외를 throw한다.
n 을 반환한다.
Symbol
TypeError 예외를 throw한다.
7.1.14 StringToBigInt ( str )
추상 연산 StringToBigInt는 인수 str (문자열)을 받아 BigInt 또는 undefined 를 반환한다.
호출 시 다음 단계를 수행한다:
literal 을 ParseText (str , StringIntegerLiteral )로 한다.
literal 이 오류의
리스트 면 undefined 를 반환한다.
mv 를 literal 의 MV로 한다.
Assert :
mv 는 정수 여야 한다.
ℤ (mv )를 반환한다.
7.1.14.1 StringIntegerLiteral 문법
StringToBigInt 는 다음 문법을 사용한다.
구문
StringIntegerLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral
:::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
7.1.14.2 런타임 의미: MV
7.1.15 ToBigInt64 ( argument )
추상 연산 ToBigInt64는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 [-263 , 263 -1] 구간의
264 BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:
n 을 ? ToBigInt (argument )로 한다.
int64bit 를 ℝ (n ) modulo 264 로 한다.
int64bit ≥ 263 이면 ℤ (int64bit - 264 )를, 아니면 ℤ (int64bit )를 반환한다.
7.1.16 ToBigUint64 ( argument )
추상 연산 ToBigUint64는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 BigInt
또는 throw 완료 를 반환한다. 이 연산은
argument 를 [0, 264 -1] 구간의 264
BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:
n 을 ? ToBigInt (argument )로 한다.
int64bit 를 ℝ (n ) modulo 264 로 한다.
ℤ (int64bit )를
반환한다.
7.1.17 ToString ( argument )
추상 연산 ToString은 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 문자열 또는
throw 완료 를 반환한다. 이 연산은
argument 를 String 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:
argument 가 문자열 이면
argument 를 반환한다.
argument 가 심볼 이면
TypeError 예외를 throw한다.
argument 가 undefined 이면 "undefined" 를
반환한다.
argument 가 null 이면 "null" 를 반환한다.
argument 가 true 이면 "true" 를 반환한다.
argument 가 false 이면 "false" 를 반환한다.
argument 가 Number 이면
Number::toString (argument ,
10)을 반환한다.
argument 가 BigInt 이면
BigInt::toString (argument ,
10)을 반환한다.
Assert :
argument 가 객체임 을 보장한다.
primValue 를 ? ToPrimitive (argument ,
string )로 한다.
Assert :
primValue 가 객체가 아님 을 보장한다.
? ToString (primValue )를 반환한다.
7.1.18 ToObject ( argument )
추상 연산 ToObject는 인수 argument (ECMAScript
언어 값 )을 받아, 정상 완료를
포함하는 객체 또는 throw 완료 를
반환합니다.
이 연산은 argument 를 객체 타입 값으로 변환합니다. 호출 시 다음 단계를 수행합니다:
argument 가 undefined 또는 null 이라면,
TypeError 예외를 발생시킵니다.
argument 가 Boolean 이라면,
argument 를 설정한
[[BooleanData]] 내부 슬롯을 가진 새로운 Boolean 객체를 반환합니다. Boolean 객체에 대한
설명은
20.3 을 참조하십시오.
argument 가 Number 라면,
argument 를 설정한
[[NumberData]] 내부 슬롯을 가진 새로운 Number 객체를 반환합니다. Number 객체에 대한
설명은
21.1 을 참조하십시오.
argument 가 String 이라면,
argument 를 설정한
[[StringData]] 내부 슬롯을 가진 새로운 String 객체를 반환합니다. String 객체에 대한
설명은
22.1 을 참조하십시오.
argument 가 Symbol 이라면,
argument 를 설정한
[[SymbolData]] 내부 슬롯을 가진 새로운 Symbol 객체를 반환합니다. Symbol 객체에 대한
설명은
20.4 을 참조하십시오.
argument 가 BigInt 라면,
argument 를 설정한
[[BigIntData]] 내부 슬롯을 가진 새로운 BigInt 객체를 반환합니다. BigInt 객체에 대한
설명은
21.2 을 참조하십시오.
단언 :
argument 는
객체 입니다.
argument 를 반환합니다.
7.1.19 ToPropertyKey ( argument )
추상 연산 ToPropertyKey는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
프로퍼티 키 또는
throw 완료 를 반환한다. 이 연산은
argument 를 프로퍼티
키 로 사용할 수 있는 값으로 변환한다. 호출 시 다음 단계를 수행한다:
key 를 ? ToPrimitive (argument ,
string )로 한다.
key 가 심볼 이면, 다음을 수행한다:
key 를 반환한다.
! ToString (key )를 반환한다.
7.1.20 ToLength ( argument )
추상 연산 ToLength는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 음이 아닌
정수
Number 또는 throw 완료 를
반환한다. 이 연산은 argument 를 배열과 유사한 객체의 길이로 사용하기에 적합한 음이 아닌 정수 Number 로
클램프 및 절단한다. 호출 시 다음 단계를 수행한다:
len 을 ? ToIntegerOrInfinity (argument )로 한다.
len ≤ 0이면 +0 𝔽 을 반환한다.
𝔽 (min (len ,
253 - 1))를 반환한다.
7.1.21 CanonicalNumericIndexString ( argument )
추상 연산 CanonicalNumericIndexString는 인수 argument (문자열)를 받아 Number 또는
undefined 를 반환한다. argument 가 "-0" 이거나 어떤 Number 값
n 에 대해 ToString (n )과 정확히 일치하면, 해당 Number 값을 반환한다.
그렇지 않으면 undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
argument 가 "-0" 이면
-0 𝔽 을 반환한다.
n 을 ! ToNumber (argument )로 한다.
! ToString (n )이 argument 와
같으면 n 을 반환한다.
undefined 를 반환한다.
표준 숫자 문자열(canonical numeric
string) 은 CanonicalNumericIndexString 추상 연산이 undefined 를 반환하지 않는 모든
문자열이다.
7.1.22 ToIndex ( value )
추상 연산 ToIndex는 인수 value (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 음이 아닌
정수 또는 throw 완료 를 반환한다. 이 연산은
value 를 정수 로
변환하고, 그 값이 음이 아니면서 정수
인덱스 에 해당하면 그 정수 를 반환한다. 그렇지 않으면 예외를 던진다. 호출 시 다음 단계를 수행한다:
integer 를 ? ToIntegerOrInfinity (value )로 한다.
integer 가 [0, 253 - 1] 구간에 없으면
RangeError 예외를 throw한다.
integer 를 반환한다.
7.2 테스트 및 비교 연산
7.2.1 RequireObjectCoercible ( argument )
추상 연산 RequireObjectCoercible는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
argument 를 ToObject 를 통해 객체로 변환할 수 없을 경우 오류를 던진다. 표 14 에 정의되어 있다:
표 14: RequireObjectCoercible 결과
인수 타입
결과
Undefined
TypeError 예외를 throw한다.
Null
TypeError 예외를 throw한다.
Boolean
argument 를 반환한다.
Number
argument 를 반환한다.
String
argument 를 반환한다.
Symbol
argument 를 반환한다.
BigInt
argument 를 반환한다.
Object
argument 를 반환한다.
7.2.2 IsArray ( argument )
추상 연산 IsArray는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 Array 이그조틱 객체 이면
true 를 반환한다.
argument 가 Proxy 이그조틱 객체 이면, 다음을 수행한다:
? ValidateNonRevokedProxy (argument )를
수행한다.
proxyTarget 을 argument .[[ProxyTarget]] 로 한다.
? IsArray (proxyTarget )를
반환한다.
false 를 반환한다.
7.2.3 IsCallable ( argument )
추상 연산 IsCallable은 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 가 [[Call]] 내부 메서드를 가진 호출 가능한
함수인지 판단한다. 호출 시 다음 단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 [[Call]] 내부 메서드를 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.4 IsConstructor ( argument )
추상 연산 IsConstructor는 인수 argument (ECMAScript 언어 값 )를 받아
Boolean을 반환한다. 이 연산은 argument 가 함수 객체 이면서 [[Construct]]
내부 메서드를 갖는지 판단한다. 호출 시 다음 단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
argument 가 [[Construct]] 내부 메서드를 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.5 IsExtensible ( O )
추상 연산 IsExtensible은 인수 O (객체)를 받아, 특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
O 에 추가 프로퍼티를 추가할 수 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[IsExtensible]] ()를 반환한다.
7.2.6 IsRegExp ( argument )
추상 연산 IsRegExp는 인수 argument (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
argument 가 객체가 아니면 false 를 반환한다.
matcher 를 ? Get (argument ,
%Symbol.match% )로 한다.
matcher 가 undefined 가 아니면, ToBoolean (matcher )를 반환한다.
argument 가 [[RegExpMatcher]] 내부 슬롯을 가지고 있으면
true 를 반환한다.
false 를 반환한다.
7.2.7 정적 의미: IsStringWellFormedUnicode (
string )
추상 연산 IsStringWellFormedUnicode는 인수 string (문자열)을 받아 Boolean을 반환한다. string 을
6.1.4 에서 설명된 대로 UTF-16
인코딩 코드 포인트의 시퀀스로 해석하고, 이것이 well formed 한
UTF-16 시퀀스인지 판단한다. 호출 시 다음 단계를 수행한다:
len 을 string 의 길이로 한다.
k 를 0으로 한다.
k < len 인 동안 반복한다:
cp 를 CodePointAt (string ,
k )로 한다.
cp .[[IsUnpairedSurrogate]] 가
true 이면 false 를 반환한다.
k 를 k + cp .[[CodeUnitCount]] 로 설정한다.
true 를 반환한다.
7.2.8 SameType ( x , y )
추상 연산 SameType은 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 동일한 타입인지 판별한다. 호출 시 다음 단계를 수행한다:
x 가 undefined 이고 y 가
undefined 이면 true 를 반환한다.
x 가 null 이고 y 가 null 이면
true 를 반환한다.
x 가 Boolean 이고
y 가 Boolean 이면
true 를 반환한다.
x 가 Number 이고
y 가 Number 이면
true 를 반환한다.
x 가 BigInt 이고
y 가 BigInt 이면
true 를 반환한다.
x 가 Symbol 이고
y 가 Symbol 이면
true 를 반환한다.
x 가 String 이고
y 가 String 이면
true 를 반환한다.
x 가 객체 이고 y 가 객체 이면 true 를 반환한다.
false 를 반환한다.
7.2.9 SameValue ( x , y )
추상 연산 SameValue는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 같은 값인지 판단한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::sameValue (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
이 알고리즘은 IsStrictlyEqual 알고리즘과는 모든
NaN 값을 동일하게 취급하고 +0 𝔽 과
-0 𝔽 을 구분한다는 점에서 다르다.
7.2.10 SameValueZero ( x , y )
추상 연산 SameValueZero는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
두 인수가 같은 값인지 판단하되, +0 𝔽 과 -0 𝔽 의 차이를
무시한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::sameValueZero (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
SameValueZero는 SameValue 와 다르게
+0 𝔽 과 -0 𝔽 을 동일하게 취급한다.
7.2.11 SameValueNonNumber ( x , y )
추상 연산 SameValueNonNumber는 인수 x (ECMAScript 언어 값 ,
Number 제외)와 y (ECMAScript 언어 값 , Number 제외)를 받아
Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
SameType (x , y )가
true 임을 보장한다.
x 가 undefined 또는 null 이면
true 를 반환한다.
x 가 BigInt 이면, 다음을
수행한다:
BigInt::equal (x ,
y )를 반환한다.
x 가 String 이면, 다음을
수행한다:
x 와 y 가 길이가 같고 모든 위치의 코드 유닛이 같으면 true 를,
그렇지 않으면 false 를 반환한다.
x 가 Boolean 이면, 다음을
수행한다:
x 와 y 가 모두 true 이거나 모두
false 이면 true 를, 그렇지 않으면
false 를 반환한다.
참고: 다른 모든 ECMAScript 언어 값 은
동일성(identity)으로 비교한다.
x 가 y 와 동일하면 true 를, 그렇지 않으면
false 를 반환한다.
참고 1
설명 목적으로 일부 경우가 불필요하게 별도로 처리되어 있다.
참고 2
"
x 가
y 와 동일하다"의 구체적인 의미는
5.2.7 에 자세히 설명되어 있다.
7.2.12 IsLessThan ( x , y , LeftFirst
)
추상 연산 IsLessThan은 인수 x (ECMAScript 언어 값 ),
y (ECMAScript 언어 값 ),
LeftFirst (Boolean)을 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 undefined , 또는 throw 완료 를
반환한다. 이 연산은 비교 x < y 의 의미를 제공하며, true ,
false , undefined (피연산자 중 하나 이상이 NaN 인
경우)을 반환한다. LeftFirst 플래그는 x 와 y 에 부수 효과가 있을 수 있을 때 연산의 순서를 제어하는 데
사용된다. 호출 시 다음 단계를 수행한다:
LeftFirst 가 true 이면, 다음을 수행한다:
px 를 ? ToPrimitive (x ,
number )로 한다.
py 를 ? ToPrimitive (y ,
number )로 한다.
그 외의 경우:
참고: 평가 순서를 유지하기 위해 평가 순서를 반대로 한다.
py 를 ? ToPrimitive (y ,
number )로 한다.
px 를 ? ToPrimitive (x ,
number )로 한다.
px 가 문자열 이고
py 가 문자열 이면, 다음을
수행한다:
lx 를 px 의 길이로 한다.
ly 를 py 의 길이로 한다.
0 ≤ i < min (lx , ly )인 모든
정수
i 에 대해, 오름차순으로 다음을 수행한다:
cx 를 px 의 인덱스 i 에 있는 코드 유닛의 숫자 값으로 한다.
cy 를 py 의 인덱스 i 에 있는 코드 유닛의 숫자 값으로 한다.
cx < cy 이면 true 를 반환한다.
cx > cy 이면 false 를 반환한다.
lx < ly 이면 true 를, 아니면
false 를 반환한다.
그 외의 경우:
px 가 BigInt 이고
py 가 문자열 이면,
다음을 수행한다:
ny 를 StringToBigInt (py )로
한다.
ny 가 undefined 이면
undefined 를 반환한다.
BigInt::lessThan (px ,
ny )를 반환한다.
px 가 문자열 이고
py 가 BigInt 이면,
다음을 수행한다:
nx 를 StringToBigInt (px )로
한다.
nx 가 undefined 이면
undefined 를 반환한다.
BigInt::lessThan (nx ,
py )를 반환한다.
참고: px 와 py 는 원시값이므로 평가 순서는 중요하지 않다.
nx 를 ? ToNumeric (px )로 한다.
ny 를 ? ToNumeric (py )로 한다.
SameType (nx ,
ny )가 true 이면, 다음을 수행한다:
nx 가 Number 이면,
다음을 수행한다:
Number::lessThan (nx ,
ny )를 반환한다.
그 외의 경우:
Assert : nx 가
BigInt 임을
보장한다.
BigInt::lessThan (nx ,
ny )를 반환한다.
Assert :
nx 가 BigInt 이고
ny 가 Number 이거나,
nx 가 Number 이고
ny 가 BigInt 임을
보장한다.
nx 또는 ny 가 NaN 이면
undefined 를 반환한다.
nx 가 -∞ 𝔽 이거나 ny 가
+∞ 𝔽 이면 true 를 반환한다.
nx 가 +∞ 𝔽 이거나 ny 가
-∞ 𝔽 이면 false 를 반환한다.
ℝ (nx )
< ℝ (ny )이면 true 를,
아니면 false 를 반환한다.
참고 1
3 단계는 1.c ( 13.15.3 )에서 논리합 대신
논리곱을 사용한다는 점에서 다르다.
참고 2
문자열의 비교는 UTF-16 코드 유닛의 시퀀스에 대한 단순한 사전식(lexicographic) 정렬을 사용한다. 유니코드 명세에 정의된 문자/문자열 동등성 및
정렬 순서의 더 복잡하고 의미론적인 정의는 사용하지 않는다. 따라서 유니코드 표준에서 정규적으로 동등하지만 정규화 형식이 다른 String 값은 같지 않다고
판정될 수 있다. 또한, 코드 유닛 기준 사전식 정렬은 서러게이트 쌍 이 포함된 문자열의 코드 포인트 기준 정렬과 다를 수 있다.
7.2.13 IsLooselyEqual ( x , y )
추상 연산 IsLooselyEqual는 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
== 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
true 면, 다음을 수행한다:
IsStrictlyEqual (x ,
y )를 반환한다.
x 가 null 이고 y 가 undefined 이면
true 를 반환한다.
x 가 undefined 이고 y 가 null 이면
true 를 반환한다.
참고: 이 단계는 B.3.6.2 절에서 대체된다.
x 가 Number 이고
y 가 String 이면,
! IsLooselyEqual (x ,
! ToNumber (y ))를 반환한다.
x 가 String 이고
y 가 Number 이면,
! IsLooselyEqual (! ToNumber (x ), y )를 반환한다.
x 가 BigInt 이고
y 가 String 이면, 다음을
수행한다:
n 을 StringToBigInt (y )로
한다.
n 이 undefined 이면 false 를 반환한다.
! IsLooselyEqual (x ,
n )을 반환한다.
x 가 String 이고
y 가 BigInt 이면,
! IsLooselyEqual (y ,
x )를 반환한다.
x 가 Boolean 이면,
! IsLooselyEqual (!
ToNumber (x ), y )를 반환한다.
y 가 Boolean 이면,
! IsLooselyEqual (x ,
! ToNumber (y ))를 반환한다.
x 가 String, Number, BigInt, Symbol 중 하나이고 y 가 객체 이면, ! IsLooselyEqual (x ,
? ToPrimitive (y ))를 반환한다.
x 가 객체 이고 y 가 String, Number,
BigInt, Symbol 중 하나이면, ! IsLooselyEqual (?
ToPrimitive (x ), y )를
반환한다.
x 가 BigInt 이고
y 가 Number 이거나,
x 가 Number 이고
y 가 BigInt 이면, 다음을
수행한다:
x 가 유한 이 아니거나 y 가 유한 이 아니면
false 를 반환한다.
ℝ (x )
= ℝ (y )이면 true 를, 아니면
false 를 반환한다.
false 를 반환한다.
7.2.14 IsStrictlyEqual ( x , y )
추상 연산 IsStrictlyEqual은 인수 x (ECMAScript 언어 값 )와
y (ECMAScript 언어 값 )를 받아 Boolean을 반환한다.
이 연산은 === 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:
SameType (x , y )가
false 이면 false 를 반환한다.
x 가 Number 이면, 다음을
수행한다:
Number::equal (x ,
y )를 반환한다.
SameValueNonNumber (x ,
y )를 반환한다.
참고
이 알고리즘은 부호 있는 0과 NaN 처리에서 SameValue 알고리즘과 다르다.
7.3 객체에 대한 연산
7.3.1 MakeBasicObject ( internalSlotsList )
추상 연산 MakeBasicObject는 인수 internalSlotsList (내부 슬롯 이름의 List )를 받아 객체를 반환한다. 이는
일반
객체 와 특수 객체 를 포함하여 알고리즘적으로 생성되는 모든 ECMAScript 객체의 근원이다. 이는
모든 객체 생성에 사용되는 공통 단계를 분리하고 객체 생성을 중앙 집중화한다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 internalSlotsList 와 « [[PrivateElements]] »의 list-concatenation 으로
설정한다.
obj 를 internalSlotsList 의 각 이름에 대해 내부 슬롯을 가지는 새로 생성된 객체로 한다.
참고: 객체 내부 메서드 및
내부 슬롯 에 설명된 바와 같이, 각 내부 슬롯의 초기 값은 별도로 명시되지 않는 한
undefined 이다.
obj .[[PrivateElements]] 를 새로운 빈 List 로 설정한다.
obj 의 필수 내부 메서드를 일반 객체 에 10.1 에
명시된 기본 정의로 설정한다.
Assert : 호출자가
obj 의 [[GetPrototypeOf]] 와 [[SetPrototypeOf]] 필수 내부 메서드를 모두 재정의하지 않는 경우,
internalSlotsList 는 [[Prototype]] 을 포함한다.
Assert : 호출자가
obj 의 [[SetPrototypeOf]] , [[IsExtensible]] , [[PreventExtensions]]
필수 내부 메서드를 모두 재정의하지 않는 경우, internalSlotsList 는 [[Extensible]] 을 포함한다.
internalSlotsList 에 [[Extensible]] 가 포함되어 있으면
obj .[[Extensible]] 를 true 로 설정한다.
obj 를 반환한다.
참고
이 명세 내에서 특수
객체 는 추상 연산
(ArrayCreate , BoundFunctionCreate 등)에서 먼저
MakeBasicObject를 호출해 기본 객체를 얻고, 그 후에 해당 객체의 일부 또는 전체 내부 메서드를 재정의함으로써 생성된다. 특수 객체 생성을
캡슐화하기 위해, 객체의 필수 내부 메서드는 이러한 연산 외부에서 변경되지 않는다.
7.3.2 Get ( O , P )
추상 연산 Get은 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
객체의 특정 프로퍼티 값을 조회할 때 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[Get]] (P , O )를 반환한다.
7.3.3 GetV ( V , P )
추상 연산 GetV는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
ECMAScript 언어 값 의 특정 프로퍼티 값을 조회할 때
사용된다. 만약 값이 객체가 아니면, 해당 타입에 맞는 래퍼 객체를 사용해 프로퍼티 조회를 수행한다. 호출 시 다음 단계를 수행한다:
O 를 ? ToObject (V )로 한다.
? O .[[Get]] (P , V )를 반환한다.
7.3.4 Set ( O , P , V ,
Throw )
추상 연산 Set은 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Throw (Boolean)을 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 특정 프로퍼티 값을 설정할 때 사용된다. V 는 프로퍼티에 할당할 새 값이다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[Set]] (P , V , O )로
한다.
success 가 false 이고 Throw 가
true 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.5 CreateDataProperty ( O , P , V
)
추상 연산 CreateDataProperty는 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:
newDesc 를 PropertyDescriptor { [[Value]] :
V , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true }로 한다.
? O .[[DefineOwnProperty]] (P ,
newDesc )를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지
않는다. 만약 존재하고 설정 불가이거나 O 가 확장 가능하지 않다면, [[DefineOwnProperty]] 는 false 를 반환한다.
7.3.6 CreateDataPropertyOrThrow ( O , P ,
V )
추상 연산 CreateDataPropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError
예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? CreateDataProperty (O ,
P , V )로 한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지
않는다. 만약 존재하고 설정 불가이거나 O 가 확장 가능하지 않다면, [[DefineOwnProperty]] 는 false 를 반환하고, 이 연산은
TypeError 예외를 던진다.
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O ,
P , V )
추상 연산 CreateNonEnumerableDataPropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ),
V (ECMAScript 언어 값 )를 받아
unused 를 반환한다. 이 연산은 일반 객체 의 새로운 비열거형 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를
수행한다:
Assert :
O 는 비설정 불가 프로퍼티가 없는 일반적이고 확장 가능한 객체이다.
newDesc 를 PropertyDescriptor { [[Value]] :
V , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }로 한다.
! DefinePropertyOrThrow (O ,
P , newDesc )를 수행한다.
unused 를 반환한다.
참고
이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성하지만, 열거형이 아니다. 일반적으로 프로퍼티는
이미 존재하지 않는다. 만약 존재한다면 DefinePropertyOrThrow 가 정상적으로
완료됨이 보장된다.
7.3.8 DefinePropertyOrThrow ( O , P ,
desc )
추상 연산 DefinePropertyOrThrow는 인수 O (객체), P (프로퍼티 키 ), desc (프로퍼티 디스크립터 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 [[DefineOwnProperty]] 내부 메서드를 호출하여, 요청된 프로퍼티 갱신을 수행할 수
없을 경우 TypeError 예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[DefineOwnProperty]] (P , desc )로
한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.9 DeletePropertyOrThrow ( O , P )
추상 연산 DeletePropertyOrThrow는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 객체의 특정 자기 프로퍼티를 제거하는 데 사용된다. 해당 프로퍼티가 설정 불가라면 예외를 던진다. 호출 시 다음 단계를 수행한다:
success 를 ? O .[[Delete]] (P )로 한다.
success 가 false 이면 TypeError 예외를 throw한다.
unused 를 반환한다.
7.3.10 GetMethod ( V , P )
추상 연산 GetMethod는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 )를 받아,
특정 값을 포함하는 정상 완료 함수 객체
또는 undefined , 혹은 throw 완료 를
반환한다. 이 연산은 해당 프로퍼티의 값이 함수일 것으로 기대되는 ECMAScript 언어 값 의 특정
프로퍼티 값을 가져오는 데 사용된다. 호출 시 다음 단계를 수행한다:
func 를 ? GetV (V , P )로 한다.
func 가 undefined 또는 null 이면
undefined 를 반환한다.
IsCallable (func )이
false 이면 TypeError 예외를 throw한다.
func 를 반환한다.
7.3.11 HasProperty ( O , P )
추상 연산 HasProperty는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체에 지정된 프로퍼티
키 의 프로퍼티가 존재하는지(자기 또는 상속 포함) 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:
? O .[[HasProperty]] (P )를 반환한다.
7.3.12 HasOwnProperty ( O , P )
추상 연산 HasOwnProperty는 인수 O (객체), P (프로퍼티 키 )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체에 지정된 프로퍼티
키 의 자기 프로퍼티가 존재하는지 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 한다.
desc 가 undefined 이면 false 를 반환한다.
true 를 반환한다.
7.3.13 Call ( F , V [ ,
argumentsList ] )
추상 연산 Call은 인수 F (ECMAScript 언어 값 ),
V (ECMAScript 언어 값 ), 선택적 인수
argumentsList (ECMAScript 언어 값의
List )를 받아,
특정 값을 포함하는 정상 완료
ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은 함수
객체의 [[Call]] 내부 메서드를 호출하는 데 사용된다. F 가 함수 객체이고, V 는
[[Call]] 의 this 값이며, argumentsList 는 내부
메서드의 해당 인수로 전달된다. argumentsList 가 없으면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
argumentsList 가 없으면, argumentsList 를 새로운 빈 List 로 설정한다.
IsCallable (F )가
false 이면 TypeError 예외를 throw한다.
? F .[[Call]] (V , argumentsList )를
반환한다.
7.3.14 Construct ( F [ , argumentsList [ ,
newTarget ] ] )
추상 연산 Construct는 인수 F (생성자 )와 선택적 인수 argumentsList (List 의 ECMAScript 언어 값 ),
newTarget (생성자 )를 받아,
특정 값을 포함하는 정상 완료 객체 또는
throw 완료 를 반환한다. 이 연산은
함수
객체 의 [[Construct]] 내부 메서드를 호출하는 데 사용된다.
argumentsList 와 newTarget 는 내부 메서드의 해당 인수로 전달되는 값이다.
argumentsList 가 없으면 새로운 빈 List 가 사용된다.
newTarget 가 없으면 F 가 사용된다. 호출 시 다음 단계를 수행한다:
newTarget 가 없으면 newTarget 를 F 로 설정한다.
argumentsList 가 없으면 argumentsList 를 새로운 빈 List 로 설정한다.
? F .[[Construct]] (argumentsList ,
newTarget )를 반환한다.
참고
newTarget 가 없으면 이 연산은 new F(...argumentsList)와 같다.
7.3.15 SetIntegrityLevel ( O , level )
추상 연산 SetIntegrityLevel은 인수 O (객체), level (sealed 또는
frozen )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 자기 프로퍼티 집합을 고정하는 데 사용된다. 호출 시 다음 단계를 수행한다:
status 를 ? O .[[PreventExtensions]] ()로
한다.
status 가 false 이면 false 를 반환한다.
keys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
level 이 sealed 이면,
keys 의 각 요소 k 에 대해, 다음을 수행한다:
? DefinePropertyOrThrow (O ,
k , PropertyDescriptor { [[Configurable]] :
false })를 수행한다.
그 외의 경우,
Assert :
level 은 frozen 이다.
keys 의 각 요소 k 에 대해, 다음을 수행한다:
currentDesc 를 ? O .[[GetOwnProperty]] (k )로 한다.
currentDesc 가 undefined 가 아니면, 다음을 수행한다:
IsAccessorDescriptor (currentDesc )
가 true 이면,
desc 를 PropertyDescriptor { [[Configurable]] :
false }로 한다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Configurable]] :
false , [[Writable]] :
false }로 한다.
? DefinePropertyOrThrow (O ,
k , desc )를 수행한다.
true 를 반환한다.
7.3.16 TestIntegrityLevel ( O , level )
추상 연산 TestIntegrityLevel은 인수 O (객체), level (sealed 또는
frozen )를 받아,
특정 값을 포함하는 정상 완료 Boolean
또는 throw 완료 를 반환한다. 이 연산은
객체의 자기 프로퍼티 집합이 고정되어 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:
extensible 를 ? IsExtensible (O )로 한다.
extensible 가 true 이면 false 를 반환한다.
참고: 객체가 확장 가능하면, 프로퍼티는 검사하지 않는다.
keys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
keys 의 각 요소 k 에 대해, 다음을 수행한다:
currentDesc 를 ? O .[[GetOwnProperty]] (k )로 한다.
currentDesc 가 undefined 가 아니면, 다음을 수행한다:
currentDesc .[[Configurable]] 가
true 이면 false 를 반환한다.
level 이 frozen 이고 IsDataDescriptor (currentDesc )
가 true 이면,
currentDesc .[[Writable]]
가 true 이면 false 를 반환한다.
true 를 반환한다.
7.3.17 CreateArrayFromList ( elements )
추상 연산 CreateArrayFromList는 인수 elements (List 의 ECMAScript 언어 값 )를 받아,
배열을 반환한다. 이 연산은 elements 가 제공하는 요소로 구성된 배열을 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:
array 를 ! ArrayCreate (0)으로 한다.
n 을 0으로 한다.
elements 의 각 요소 e 에 대해, 다음을 수행한다:
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (n )),
e )를 수행한다.
n 을 n + 1로 설정한다.
array 를 반환한다.
7.3.18 LengthOfArrayLike ( obj )
추상 연산 LengthOfArrayLike는 인수 obj (객체)를 받아,
정상 완료 로 음이 아닌 정수 또는 throw 완료 를 반환한다. 이 연산은
배열과 유사한 객체의 "length" 프로퍼티 값을 반환한다. 호출 시 다음 단계를 수행한다:
ℝ (? ToLength (? Get (obj ,
"length" )))를 반환한다.
배열과 유사한 객체 란 이 연산이 정상 완료 를 반환하는 모든 객체이다.
참고 1
일반적으로 배열과 유사한 객체는
정수
인덱스 이름을 가진 프로퍼티도 가진다. 하지만 이는 이 정의의 필수 조건이 아니다.
참고 2
배열과 문자열 객체는 배열과 유사한 객체의 예시이다.
7.3.19 CreateListFromArrayLike ( obj [ ,
validElementTypes ] )
추상 연산 CreateListFromArrayLike는 인수 obj (ECMAScript 언어 값 )와 선택적
인수 validElementTypes (all 또는
property-key )를 받아,
정상 완료 List (요소는 ECMAScript 언어 값 ) 또는 throw 완료 를 반환한다. 이 연산은
obj 의 인덱스 프로퍼티로부터 제공되는 요소들로 구성된 List 값을 생성하는 데 사용된다.
validElementTypes 는 요소로 허용되는 값의 타입을 나타낸다. 호출 시 다음 단계를 수행한다:
validElementTypes 가 주어지지 않으면, validElementTypes 를
all 로 설정한다.
obj 가 객체가 아니면 TypeError 예외를
throw한다.
len 을 ? LengthOfArrayLike (obj )로 한다.
list 를 새로운 빈 List 로 한다.
index 를 0으로 한다.
index < len 동안 반복한다,
indexName 을 ! ToString (𝔽 (index ))로 한다.
next 를 ? Get (obj ,
indexName )로 한다.
validElementTypes 가 property-key 이고
next 가 프로퍼티 키 가 아니면
TypeError 예외를 throw한다.
next 를 list 에 추가한다.
index 를 index + 1로 한다.
list 를 반환한다.
7.3.20 Invoke ( V , P [ ,
argumentsList ] )
추상 연산 Invoke는 인수 V (ECMAScript 언어 값 ),
P (프로퍼티
키 ), 선택적 인수 argumentsList (ECMAScript 언어 값의 List )를
받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 이 연산은
ECMAScript 언어 값 의 메서드 프로퍼티를 호출하는 데
사용된다.
V 는 프로퍼티 조회 지점이자 호출 시 this 값으로 사용된다. argumentsList 는 메서드에
전달되는 인자 값들의 목록이다. argumentsList 가 없다면 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
argumentsList 가 없으면 argumentsList 를 새로운 빈 List 로 한다.
func 를 ? GetV (V , P )로 한다.
? Call (func , V ,
argumentsList )를 반환한다.
7.3.21 OrdinaryHasInstance ( C , O )
추상 연산 OrdinaryHasInstance는 인수 C (ECMAScript 언어 값 ),
O (ECMAScript 언어 값 )를 받아,
정상 완료 Boolean 또는
throw 완료 를 반환한다. 이 연산은
O 가 C 가 제공하는 인스턴스 객체 상속 경로에서 상속받는지의 기본 알고리즘을 구현한다. 호출 시 다음 단계를 수행한다:
IsCallable (C )가
false 이면 false 를 반환한다.
C 에 [[BoundTargetFunction]] 내부 슬롯이 있으면,
BC 를 C .[[BoundTargetFunction]] 로
한다.
? InstanceofOperator (O ,
BC )를 반환한다.
O 가 객체가 아니면 false 를 반환한다.
P 를 ? Get (C ,
"prototype" )로 한다.
P 가 객체가 아니면 TypeError 예외를
throw한다.
반복한다,
O 를 ? O .[[GetPrototypeOf]] ()로 한다.
O 가 null 이면 false 를 반환한다.
SameValue (P ,
O )가 true 이면 true 를 반환한다.
7.3.22 SpeciesConstructor ( O ,
defaultConstructor )
추상 연산 SpeciesConstructor는 인수 O (객체), defaultConstructor (생성자 )를 받아,
정상 완료 로 생성자 또는 throw 완료 를 반환한다. 이 연산은
O 로부터 파생된 새 객체를 생성하는 데 사용할 생성자 를 검색하는 데 사용된다. defaultConstructor 는
O 에서 생성자 %Symbol.species% 프로퍼티를 찾을 수
없을 때 사용된다. 호출 시 다음 단계를 수행한다:
C 를 ? Get (O ,
"constructor" )로 한다.
C 가 undefined 이면 defaultConstructor 를 반환한다.
C 가 객체가 아니면 TypeError 예외를
throw한다.
S 를 ? Get (C , %Symbol.species% )로 한다.
S 가 undefined 또는 null 이면
defaultConstructor 를 반환한다.
IsConstructor (S )가
true 이면 S 를 반환한다.
TypeError 예외를 throw한다.
7.3.23 EnumerableOwnProperties ( O , kind )
추상 연산 EnumerableOwnProperties는 인수 O (객체), kind (key ,
value , key+value )를 받아,
정상 완료 List (ECMAScript 언어 값 ) 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
ownKeys 를 ? O .[[OwnPropertyKeys]] ()로 한다.
results 를 새로운 빈 List 로 한다.
ownKeys 의 각 요소 key 에 대해, 다음을 수행한다:
key 가 문자열이면 ,
다음을 수행한다:
desc 를 ? O .[[GetOwnProperty]] (key )로
한다.
desc 가 undefined 가 아니고 desc .[[Enumerable]] 가 true 이면, 다음을
수행한다:
kind 가 key 이면,
key 를 results 에 추가한다.
그 외의 경우,
value 를 ? Get (O ,
key )로 한다.
kind 가 value 이면,
value 를 results 에 추가한다.
그 외의 경우,
Assert :
kind 가
key+value 임을 보장한다.
entry 를 CreateArrayFromList («
key , value »)로 한다.
entry 를 results 에 추가한다.
results 를 반환한다.
7.3.24 GetFunctionRealm ( obj )
추상 연산 GetFunctionRealm은 인수 obj (함수 객체 )를 받아,
정상 완료 Realm Record 또는
throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
obj 에 [[Realm]] 내부 슬롯이 있으면,
obj .[[Realm]] 을 반환한다.
obj 가 bound function exotic
object 이면,
boundTargetFunction 을 obj .[[BoundTargetFunction]] 로 한다.
? GetFunctionRealm (boundTargetFunction )을
반환한다.
obj 가 Proxy exotic object 이면,
? ValidateNonRevokedProxy (obj )를
수행한다.
proxyTarget 을 obj .[[ProxyTarget]] 로
한다.
Assert :
proxyTarget 가 함수 객체 임을 보장한다.
? GetFunctionRealm (proxyTarget )을
반환한다.
현재 Realm Record 를 반환한다.
참고
4 단계는
obj 가 [[Realm]] 내부 슬롯이 없는 비표준 함수 특수 객체 일
때만 도달한다.
7.3.25 CopyDataProperties ( target , source ,
excludedItems )
추상 연산 CopyDataProperties는 인수 target (객체), source (ECMAScript 언어 값 ),
excludedItems (프로퍼티 키의
List )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
source 가 undefined 또는 null 이면,
unused 를 반환한다.
from 을 ! ToObject (source )로 한다.
keys 를 ? from .[[OwnPropertyKeys]] ()로 한다.
keys 의 각 요소 nextKey 에 대해, 다음을 수행한다:
excluded 를 false 로 한다.
excludedItems 의 각 요소 e 에 대해, 다음을 수행한다:
SameValue (e ,
nextKey )가 true 이면,
excluded 를 true 로 설정한다.
excluded 가 false 이면, 다음을 수행한다:
desc 를 ? from .[[GetOwnProperty]] (nextKey )로
한다.
desc 가 undefined 가 아니고 desc .[[Enumerable]] 가 true 이면, 다음을
수행한다:
propValue 를 ? Get (from ,
nextKey )로 한다.
! CreateDataPropertyOrThrow (target ,
nextKey , propValue )를 수행한다.
unused 를 반환한다.
참고
여기서 전달된 target은 항상 새로 생성된 객체이므로, 오류가 발생해도 직접 접근할 수 없다.
7.3.26 PrivateElementFind ( O , P )
추상 연산 PrivateElementFind는 인수 O (객체), P (프라이빗 이름 )를 받아,
PrivateElement 또는
empty 를 반환한다. 호출 시 다음 단계를 수행한다:
O .[[PrivateElements]] 에 PrivateElement
pe 가 존재하고, pe .[[Key]] 가 P 와 같으면,
pe 를 반환한다.
empty 를 반환한다.
7.3.27 PrivateFieldAdd ( O , P ,
value )
추상 연산 PrivateFieldAdd는 인수 O (객체), P (프라이빗 이름 ),
value (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
호스트 가 웹 브라우저이면,
? HostEnsureCanAddPrivateElement (O )를
수행한다.
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 가 아니면 TypeError 예외를
throw한다.
PrivateElement {
[[Key]] : P , [[Kind]] :
field , [[Value]] :
value }를 O .[[PrivateElements]] 에
추가한다.
unused 를 반환한다.
7.3.28 PrivateMethodOrAccessorAdd ( O , method
)
추상 연산 PrivateMethodOrAccessorAdd는 인수 O (객체), method (PrivateElement )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
Assert :
method .[[Kind]] 가 method 또는
accessor 임을 보장한다.
호스트 가 웹 브라우저이면,
? HostEnsureCanAddPrivateElement (O )를
수행한다.
entry 를 PrivateElementFind (O ,
method .[[Key]] )로 한다.
entry 가 empty 가 아니면 TypeError 예외를
throw한다.
method 를 O .[[PrivateElements]] 에 추가한다.
unused 를 반환한다.
참고
프라이빗 메서드와 접근자의 값은 인스턴스 간에 공유된다. 이 연산은 메서드나 접근자의 새 복사본을 생성하지 않는다.
7.3.29 HostEnsureCanAddPrivateElement ( O )
호스트 정의 추상 연산
HostEnsureCanAddPrivateElement는 인수 O (객체)를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 이 연산은 호스트
환경 이 특정 호스트 정의 특수 객체 에 프라이빗 요소 추가를 방지할 수 있도록 한다.
HostEnsureCanAddPrivateElement의 구현은 다음 요구사항을 따라야 한다:
HostEnsureCanAddPrivateElement의 기본 구현은 NormalCompletion (unused )을
반환하는 것이다.
이 추상 연산은 ECMAScript 호스트 가 웹
브라우저인 경우에만 호출된다.
7.3.30 PrivateGet ( O , P )
추상 연산 PrivateGet은 인수 O (객체), P (프라이빗 이름 )를 받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 이면 TypeError 예외를
throw한다.
entry .[[Kind]] 가 field 또는
method 이면,
entry .[[Value]] 를 반환한다.
Assert :
entry .[[Kind]] 가 accessor 임을
보장한다.
entry .[[Get]] 이 undefined 이면
TypeError 예외를 throw한다.
getter 를 entry .[[Get]] 로 한다.
? Call (getter , O )를 반환한다.
7.3.31 PrivateSet ( O , P , value )
추상 연산 PrivateSet은 인수 O (객체), P (프라이빗 이름 ),
value (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
entry 를 PrivateElementFind (O ,
P )로 한다.
entry 가 empty 이면 TypeError 예외를
throw한다.
entry .[[Kind]] 가 field 이면,
entry .[[Value]] 에 value 를 할당한다.
그 외 entry .[[Kind]] 가 method 이면,
TypeError 예외를 throw한다.
그 외의 경우,
Assert :
entry .[[Kind]] 가
accessor 임을 보장한다.
entry .[[Set]] 이
undefined 이면 TypeError 예외를 throw한다.
setter 를 entry .[[Set]] 로 한다.
? Call (setter , O ,
« value » )를 수행한다.
unused 를 반환한다.
7.3.32 DefineField ( receiver , fieldRecord )
추상 연산 DefineField는 인수 receiver (객체), fieldRecord (ClassFieldDefinition
Record )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
fieldName 을 fieldRecord .[[Name]] 로 한다.
initializer 를 fieldRecord .[[Initializer]] 로
한다.
initializer 가 empty 가 아니면,
initValue 를 ? Call (initializer ,
receiver )로 한다.
그 외의 경우,
initValue 를 undefined 로 한다.
fieldName 이 프라이빗 이름 이면,
? PrivateFieldAdd (receiver ,
fieldName , initValue )를 수행한다.
그 외의 경우,
Assert :
fieldName 이 프로퍼티 키 임을 보장한다.
? CreateDataPropertyOrThrow (receiver ,
fieldName , initValue )를 수행한다.
unused 를 반환한다.
7.3.33 InitializeInstanceElements ( O ,
constructor )
추상 연산 InitializeInstanceElements는 인수 O (객체), constructor (ECMAScript
함수
객체 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
methods 를 constructor .[[PrivateMethods]] 로
한다.
methods 의 각 PrivateElement
method 에 대해, 다음을 수행한다:
? PrivateMethodOrAccessorAdd (O ,
method )를 수행한다.
fields 를 constructor .[[Fields]] 로 한다.
fields 의 각 요소 fieldRecord 에 대해, 다음을 수행한다:
? DefineField (O ,
fieldRecord )를 수행한다.
unused 를 반환한다.
7.3.34 AddValueToKeyedGroup ( groups , key ,
value )
추상 연산 AddValueToKeyedGroup은 인수 groups (List 의 Record 이며, 필드 [[Key]] (ECMAScript 언어 값 )와
[[Elements]] (List 의
ECMAScript 언어 값 )),
key (ECMAScript 언어 값 ),
value (ECMAScript 언어 값 )를 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
groups 의 각 Record { [[Key]] , [[Elements]] } g 에
대해, 다음을 수행한다:
SameValue (g .[[Key]] , key )가 true 이면,
Assert : groups 의 정확히 하나의
요소만 이 조건을 만족한다.
value 를 g .[[Elements]] 에
추가한다.
unused 를 반환한다.
group 을 Record { [[Key]] : key , [[Elements]] :
« value » }로 한다.
group 을 groups 에 추가한다.
unused 를 반환한다.
7.3.35 GroupBy ( items , callback ,
keyCoercion )
추상 연산 GroupBy는 인수 items (ECMAScript 언어 값 ),
callback (ECMAScript 언어 값 ),
keyCoercion (property 또는 collection )를
받아,
정상 완료 List (Record 이며, 필드 [[Key]] (ECMAScript 언어 값 ) 및
[[Elements]] (List 의
ECMAScript 언어 값 )), 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
? RequireObjectCoercible (items )를
수행한다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw한다.
groups 를 새로운 빈 List 로 한다.
iteratorRecord 를 ? GetIterator (items ,
sync )로 한다.
k 를 0으로 한다.
반복한다,
k ≥ 253 - 1이면,
error 를 ThrowCompletion (새로
생성된 TypeError 객체)로 한다.
? IteratorClose (iteratorRecord ,
error )를 반환한다.
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면,
groups 를 반환한다.
value 를 next 로 한다.
key 를 Completion (Call (callback ,
undefined , « value , 𝔽 (k ) »))로 한다.
IfAbruptCloseIterator (key ,
iteratorRecord )를 수행한다.
keyCoercion 이 property 이면,
key 를 Completion (ToPropertyKey (key ))로
설정한다.
IfAbruptCloseIterator (key ,
iteratorRecord )를 수행한다.
그 외의 경우,
Assert : keyCoercion 이
collection 임을 보장한다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정한다.
AddValueToKeyedGroup (groups ,
key , value )를 수행한다.
k 를 k + 1로 설정한다.
7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue ,
home , p , v )
추상 연산 SetterThatIgnoresPrototypeProperties는 인수 thisValue (ECMAScript 언어 값 ),
home (객체), p (프로퍼티 키 ), v (ECMAScript 언어 값 )를 받아,
정상 완료
unused 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
thisValue 가 객체가 아니면 ,
TypeError 예외를 throw한다.
SameValue (thisValue ,
home )가 true 이면,
참고: 여기서 예외를 던지는 것은 home 객체의 strict mode 코드 에서 쓰기 불가 데이터
프로퍼티에 대입하는 효과를 모방한다.
TypeError 예외를 throw한다.
desc 를 ? thisValue .[[GetOwnProperty]] (p )로 한다.
desc 가 undefined 이면,
? CreateDataPropertyOrThrow (thisValue ,
p , v )를 수행한다.
그 외의 경우,
? Set (thisValue ,
p , v , true )를 수행한다.
unused 를 반환한다.
7.4 반복자 객체에 대한 연산
공통 반복 인터페이스(27.1 참조).
7.4.1 반복자 레코드
반복자 레코드 는 Record 값으로, 반복자 또는 비동기 반복자 와 next 메서드를 캡슐화하는
데 사용된다.
반복자 레코드는 표 15 에 나열된 필드를 가진다.
표 15: 반복자 레코드 필드
7.4.2 GetIteratorDirect ( obj )
추상 연산 GetIteratorDirect는 인수 obj (객체)를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
nextMethod 를 ? Get (obj ,
"next" )로 한다.
iteratorRecord 를 반복자 레코드 { [[Iterator]] : obj , [[NextMethod]] : nextMethod , [[Done]] : false }로 한다.
iteratorRecord 를 반환한다.
7.4.3 GetIteratorFromMethod ( obj , method )
추상 연산 GetIteratorFromMethod는 인수 obj (ECMAScript 언어 값 ),
method (함수
객체 )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
iterator 를 ? Call (method ,
obj )로 한다.
iterator 가 객체가 아니면 TypeError 예외를
throw한다.
? GetIteratorDirect (iterator )를 반환한다.
7.4.4 GetIterator ( obj , kind )
추상 연산 GetIterator는 인수 obj (ECMAScript 언어 값 ),
kind (sync 또는 async )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
kind 가 async 이면,
method 를 ? GetMethod (obj , %Symbol.asyncIterator% )로
한다.
method 가 undefined 이면,
syncMethod 를 ? GetMethod (obj ,
%Symbol.iterator% )로
한다.
syncMethod 가 undefined 이면
TypeError 예외를 throw한다.
syncIteratorRecord 를 ? GetIteratorFromMethod (obj ,
syncMethod )로 한다.
CreateAsyncFromSyncIterator (syncIteratorRecord )를
반환한다.
그 외의 경우,
method 를 ? GetMethod (obj , %Symbol.iterator% )로 한다.
method 가 undefined 이면 TypeError 예외를
throw한다.
? GetIteratorFromMethod (obj ,
method )를 반환한다.
7.4.5 GetIteratorFlattenable ( obj ,
primitiveHandling )
추상 연산 GetIteratorFlattenable는 인수 obj (ECMAScript 언어 값 ),
primitiveHandling (iterate-string-primitives 또는
reject-primitives )를 받아,
정상 완료 로 반복자
레코드 또는 throw 완료 를
반환한다. 호출 시 다음 단계를 수행한다:
obj 가 객체가 아니면 ,
primitiveHandling 이 reject-primitives 이면
TypeError 예외를 throw한다.
Assert :
primitiveHandling 이 iterate-string-primitives 임을
보장한다.
obj 가 문자열이
아니면 , TypeError 예외를 throw한다.
method 를 ? GetMethod (obj , %Symbol.iterator% )로 한다.
method 가 undefined 이면,
iterator 를 obj 로 한다.
그 외의 경우,
iterator 를 ? Call (method ,
obj )로 한다.
iterator 가 객체가 아니면 TypeError 예외를
throw한다.
? GetIteratorDirect (iterator )를 반환한다.
7.4.6 IteratorNext ( iteratorRecord [ , value
] )
추상 연산 IteratorNext는 인수 iteratorRecord (반복자 레코드 ), 선택적 인수
value (ECMAScript 언어 값 )를 받아,
정상 완료 객체 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
value 가 없으면,
result 를 Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ))로 한다.
그 외의 경우,
result 를 Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « value »))로 한다.
result 가 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? result 를 반환한다.
result 를 ! result 로 설정한다.
result 가 객체가 아니면 ,
iteratorRecord .[[Done]] 를
true 로 설정한다.
TypeError 예외를 throw한다.
result 를 반환한다.
7.4.7 IteratorComplete ( iteratorResult )
추상 연산 IteratorComplete는 인수 iteratorResult (객체)를 받아,
정상 완료 불린 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
ToBoolean (? Get (iteratorResult ,
"done" ))를 반환한다.
7.4.8 IteratorValue ( iteratorResult )
추상 연산 IteratorValue는 인수 iteratorResult (객체)를 받아,
정상 완료 ECMAScript 언어 값 또는 throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
? Get (iteratorResult ,
"value" )를 반환한다.
7.4.9 IteratorStep ( iteratorRecord )
추상 연산 IteratorStep은 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 객체 또는
done , 또는 throw 완료 를
반환한다. iteratorRecord .[[Iterator]] 의
iteratorRecord .[[NextMethod]] 를 호출하여 다음 값을 요청하고, 끝에 도달하면
done 를 반환하며, 다음 값이 있으면 IteratorResult 객체 를
반환한다. 호출 시 다음 단계를 수행한다:
result 를 ? IteratorNext (iteratorRecord )로 한다.
done 을 Completion (IteratorComplete (result ))로 한다.
done 이 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? done 을 반환한다.
done 을 ! done 으로 설정한다.
done 이 true 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
done 를 반환한다.
result 를 반환한다.
7.4.10 IteratorStepValue ( iteratorRecord )
추상 연산 IteratorStepValue는 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 ECMAScript 언어 값 또는
done , 또는 throw 완료 를
반환한다. iteratorRecord .[[Iterator]] 의
iteratorRecord .[[NextMethod]] 를 호출하여 다음 값을 요청하고, 끝에 도달하면
done 를 반환하며, 다음 값이 있으면 그 값을 반환한다. 호출 시 다음 단계를 수행한다:
result 를 ? IteratorStep (iteratorRecord )로 한다.
result 가 done 이면,
done 를 반환한다.
value 를 Completion (IteratorValue (result ))로 한다.
value 가 throw
완료 이면,
iteratorRecord .[[Done]] 를
true 로 설정한다.
? value 를 반환한다.
7.4.11 IteratorClose ( iteratorRecord ,
completion )
추상 연산 IteratorClose는 인수 iteratorRecord (반복자 레코드 ),
completion (Completion
Record )를 받아,
Completion Record 를 반환한다.
이는 반복자 가 완료 상태가 되었을 때 수행해야 할 동작을 알리는 데 사용된다.
호출 시 다음 단계를 수행한다:
Assert :
iteratorRecord .[[Iterator]] 가 객체임 을 보장한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
innerResult 를 Completion (GetMethod (iterator ,
"return" ))로 한다.
innerResult 가 정상
완료 이면,
return 을 innerResult .[[Value]] 로
한다.
return 이 undefined 이면 ? completion 을
반환한다.
innerResult 를 Completion (Call (return ,
iterator ))로 설정한다.
completion 이 throw
완료 이면 ? completion 을 반환한다.
innerResult 가 throw
완료 이면 ? innerResult 를 반환한다.
innerResult .[[Value]] 가 객체가
아니면 TypeError 예외를 throw한다.
? completion 을 반환한다.
7.4.12 IfAbruptCloseIterator ( value ,
iteratorRecord )
IfAbruptCloseIterator는 반복자 레코드 를 사용하는 알고리즘 단계 시퀀스의 약식 표현이다. 다음과 같은
알고리즘 단계는:
IfAbruptCloseIterator (value ,
iteratorRecord ).
다음과 동일하다:
Assert :
value 는 Completion
Record 이다.
value 가 abrupt
완료 이면,
? IteratorClose (iteratorRecord ,
value )를 반환한다.
그 외의 경우, value 를 ! value 로 설정한다.
7.4.13 AsyncIteratorClose ( iteratorRecord ,
completion )
추상 연산 AsyncIteratorClose는 인수 iteratorRecord (반복자 레코드 ),
completion (Completion
Record )를 받아,
Completion Record 를 반환한다.
이는 비동기 반복자 가 완료 상태가 되었을 때 수행해야 할 동작을 알리는
데 사용된다. 호출 시 다음 단계를 수행한다:
Assert :
iteratorRecord .[[Iterator]] 가 객체임 을 보장한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
innerResult 를 Completion (GetMethod (iterator ,
"return" ))로 한다.
innerResult 가 정상
완료 이면,
return 을 innerResult .[[Value]] 로
한다.
return 이 undefined 이면 ? completion 을
반환한다.
innerResult 를 Completion (Call (return ,
iterator ))로 설정한다.
innerResult 가 정상 완료 이면,
innerResult 를 Completion (Await (innerResult .[[Value]] ))로 설정한다.
completion 이 throw
완료 이면 ? completion 을 반환한다.
innerResult 가 throw
완료 이면 ? innerResult 를 반환한다.
innerResult .[[Value]] 가 객체가
아니면 TypeError 예외를 throw한다.
? completion 을 반환한다.
7.4.14 CreateIteratorResultObject ( value ,
done )
추상 연산 CreateIteratorResultObject는 인수 value (ECMAScript 언어 값 ),
done (불린)을 받아,
IteratorResult 인터페이스 를 따르는 객체를 반환한다.
호출 시 다음 단계를 수행한다:
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
! CreateDataPropertyOrThrow (obj ,
"value" , value )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"done" , done )를 수행한다.
obj 를 반환한다.
7.4.15 CreateListIteratorRecord ( list )
추상 연산 CreateListIteratorRecord는 인수 list (ECMAScript 언어 값의 List )를
받아,
반복자
레코드 를 반환한다. 이 연산은 [[NextMethod]] 가
list 의 요소를 차례로 반환하는 반복자 레코드 를 생성한다. 호출 시 다음 단계를 수행한다:
closure 를 인수가 없고 list 를 캡처하는 새로운 Abstract
Closure 로 한다. 호출 시 다음 단계를 수행한다:
list 의 각 요소 E 에 대해, 다음을 수행한다:
? GeneratorYield (CreateIteratorResultObject (E ,
false ))를 수행한다.
NormalCompletion (undefined )을
반환한다.
iterator 를 CreateIteratorFromClosure (closure ,
empty , %Iterator.prototype% )로
한다.
반복자 레코드 { [[Iterator]] : iterator , [[NextMethod]] : %GeneratorPrototype.next%, [[Done]] : false }를 반환한다.
참고
리스트 반복자 객체 는 ECMAScript 코드에서 직접 접근할 수
없다.
7.4.16 IteratorToList ( iteratorRecord )
추상 연산 IteratorToList는 인수 iteratorRecord (반복자 레코드 )를 받아,
정상 완료 ECMAScript 언어 값의 List 또는
throw 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
values 를 새로운 빈 List 로 한다.
반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면,
values 를 반환한다.
next 를 values 에 추가한다.
8 구문 지시 연산
이 절에 정의된 것 외에도, 특수화된 구문 지시
연산 이 이 명세 전반에 걸쳐 정의되어 있다.
8.1 런타임 의미론: 평가
구문 지시 연산
Evaluation은 인수를 받지 않고 Completion
Record 를 반환한다.
참고
이 연산의 정의는 본 명세의 "ECMAScript 언어" 절들에 분산되어 있다. 각 정의는 해당 생성 규칙의 정의 위치 뒤에 나타난다.
8.2 스코프 분석
8.2.1 정적 의미론: BoundNames
구문 지시 연산
BoundNames는 인수를 받지 않고 문자열의
List 를 반환한다.
참고
"*default*" 는 이 명세 내에서, 별도의 이름이 없는 모듈의 기본 내보내기(default export)에 대한
합성
이름으로 사용된다. 해당 이름으로 모듈의 [[Environment]] 에 항목이 생성되고, 해당 값이
보관된다.
ResolveExport ( exportName [ ,
resolveSet ] ) 를 호출해 "default" 라는
내보내기를 해석하면, [[BindingName]] 이
"*default*" 인
ResolvedBinding Record 를 반환하게
되며,
이는 모듈의 [[Environment]] 에서 위에서 언급한 값으로 해석된다. 이는 명세의 편의를 위해서만
이루어지며, 익명 기본 내보내기 또한 다른 내보내기와 동일하게 해석할 수 있도록 한다. 이 "*default*"
문자열은
ECMAScript 코드나 모듈 연결 알고리즘에서는 접근할 수 없다.
이는 다음 생성 규칙들에 대해 분할적으로 정의된다:
BindingIdentifier
: Identifier
리스트 의 유일한 요소가
StringValue 인 Identifier 를 반환한다.
BindingIdentifier
: yield
« "yield" »를 반환한다.
BindingIdentifier
: await
« "await" »를 반환한다.
LexicalDeclaration
:
LetOrConst
BindingList
;
BoundNames of BindingList 를 반환한다.
BindingList :
BindingList
,
LexicalBinding
names1 을 BoundNames of BindingList 로 한다.
names2 를 BoundNames of LexicalBinding 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
LexicalBinding :
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
LexicalBinding :
BindingPattern
Initializer
BoundNames of BindingPattern 를
반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
names1 을 BoundNames of VariableDeclarationList 로
한다.
names2 를 BoundNames of VariableDeclaration 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
VariableDeclaration
:
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
VariableDeclaration
:
BindingPattern
Initializer
BoundNames of BindingPattern 를
반환한다.
ObjectBindingPattern
:
{
}
새로운 빈 리스트 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
names1 을 BoundNames of BindingPropertyList 로 한다.
names2 를 BoundNames of BindingRestProperty 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
]
새로운 빈 리스트 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
BoundNames of BindingRestElement 를
반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
]
BoundNames of BindingElementList 를
반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
names1 을 BoundNames of BindingElementList 로
한다.
names2 를 BoundNames of BindingRestElement 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
names1 을 BoundNames of BindingPropertyList 로 한다.
names2 를 BoundNames of BindingProperty 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
names1 을 BoundNames of BindingElementList 로
한다.
names2 를 BoundNames of BindingElisionElement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
BindingElisionElement
:
Elision opt
BindingElement
BoundNames of BindingElement 를
반환한다.
BindingProperty
:
PropertyName
:
BindingElement
BoundNames of BindingElement 를
반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
BoundNames of BindingIdentifier 를
반환한다.
BindingElement :
BindingPattern
Initializer opt
BoundNames of BindingPattern 를
반환한다.
ForDeclaration :
LetOrConst
ForBinding
BoundNames of ForBinding 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
BoundNames of BindingIdentifier 를
반환한다.
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
« "*default*" »를 반환한다.
FormalParameters
:
[empty]
새로운 빈 리스트 를 반환한다.
FormalParameters
:
FormalParameterList
,
FunctionRestParameter
names1 을 BoundNames of FormalParameterList 로 한다.
names2 를 BoundNames of FunctionRestParameter 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
names1 을 BoundNames of FormalParameterList 로 한다.
names2 를 BoundNames of FormalParameter 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이
CoverParenthesizedExpressionAndArrowParameterList 가
covered 한 것이다.
BoundNames of
formals 를 반환한다.
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
BoundNames of BindingIdentifier 를
반환한다.
GeneratorDeclaration
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
« "*default*" »를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
BoundNames of BindingIdentifier 를
반환한다.
AsyncGeneratorDeclaration
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
« "*default*" »를 반환한다.
ClassDeclaration
:
class
BindingIdentifier
ClassTail
BoundNames of BindingIdentifier 를
반환한다.
ClassDeclaration
:
class
ClassTail
« "*default*" »를 반환한다.
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
BoundNames of BindingIdentifier 를
반환한다.
AsyncFunctionDeclaration
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
« "*default*" »를 반환한다.
CoverCallExpressionAndAsyncArrowHead
:
MemberExpression
Arguments
head 를 AsyncArrowHead 로 한다. 이 CoverCallExpressionAndAsyncArrowParameterList 가
covered 한 것이다.
BoundNames of
head 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
BoundNames of ImportClause 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause opt
;
새로운 빈 리스트 를 반환한다.
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
names1 을 BoundNames of ImportedDefaultBinding 로 한다.
names2 를 BoundNames of NameSpaceImport 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ImportClause :
ImportedDefaultBinding
,
NamedImports
names1 을 BoundNames of ImportedDefaultBinding 로 한다.
names2 를 BoundNames of NamedImports 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
NamedImports :
{
}
새로운 빈 리스트 를 반환한다.
ImportsList :
ImportsList
,
ImportSpecifier
names1 을 BoundNames of ImportsList 로 한다.
names2 를 BoundNames of ImportSpecifier 로
한다.
list-concatenation of
names1 과 names2 를 반환한다.
ImportSpecifier
:
ModuleExportName
as
ImportedBinding
BoundNames of ImportedBinding 를
반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를
반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
declarationNames 를 BoundNames of HoistableDeclaration 로 한다.
만약 declarationNames 에 "*default*" 요소가 없다면,
"*default*" 을 declarationNames 에 추가한다.
declarationNames 를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
declarationNames 를 BoundNames of ClassDeclaration 로
한다.
만약 declarationNames 에 "*default*" 요소가 없다면,
"*default*" 을 declarationNames 에 추가한다.
declarationNames 를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
« "*default*" »를 반환한다.
8.2.2 정적 의미론: DeclarationPart
구문 지향 연산
DeclarationPart는 인자를 받지 않으며 파스 노드 를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
HoistableDeclaration
: FunctionDeclaration
FunctionDeclaration 를 반환한다.
HoistableDeclaration
: GeneratorDeclaration
GeneratorDeclaration 를 반환한다.
HoistableDeclaration
: AsyncFunctionDeclaration
AsyncFunctionDeclaration 를
반환한다.
HoistableDeclaration
: AsyncGeneratorDeclaration
AsyncGeneratorDeclaration 를
반환한다.
Declaration :
ClassDeclaration
ClassDeclaration 를
반환한다.
Declaration :
LexicalDeclaration
LexicalDeclaration 를 반환한다.
8.2.3 정적 의미론: IsConstantDeclaration
구문 지향 연산
IsConstantDeclaration은 인자를 받지 않으며 불리언을 반환한다.
다음 생산 규칙에 대해 조각별로 정의된다:
LexicalDeclaration
:
LetOrConst
BindingList
;
IsConstantDeclaration
of LetOrConst 를 반환한다.
LetOrConst : let
false 를 반환한다.
LetOrConst : const
true 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
ClassDeclaration
:
class
BindingIdentifier
ClassTail
class
ClassTail
false 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
;
export
NamedExports
;
export
default
AssignmentExpression
;
false 를 반환한다.
참고
export default AssignmentExpression 를 상수 선언으로
취급할
필요는 없다. 모듈의 default 객체를 참조하는 내부 바운드 이름에 할당을 허용하는 구문이 존재하지 않기 때문이다.
8.2.4 정적 의미론: LexicallyDeclaredNames
구문 지향 연산
LexicallyDeclaredNames는 인자를 받지 않으며
문자열의 리스트 를 반환한다. 다음 생산
규칙에
대해 조각별로 정의된다:
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
names1 을 LexicallyDeclaredNames
of StatementList 로
한다.
names2 를 LexicallyDeclaredNames
of StatementListItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
StatementListItem
: Statement
만약 Statement 가
Statement
:
LabelledStatement
인 경우, LexicallyDeclaredNames
of LabelledStatement 를 반환한다.
새로운 빈 리스트 를 반환한다.
StatementListItem
: Declaration
BoundNames of Declaration 를 반환한다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
names1 을 LexicallyDeclaredNames
of 첫 번째 CaseClauses 로
한다.
그렇지 않으면, names1 을 새로운 빈 리스트 로 한다.
names2 를 LexicallyDeclaredNames
of DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
names3 을 LexicallyDeclaredNames
of 두 번째 CaseClauses 로
한다.
그렇지 않으면, names3 을 새로운 빈 리스트 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
names1 을 LexicallyDeclaredNames
of CaseClauses 로 한다.
names2 를 LexicallyDeclaredNames
of CaseClause 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
LexicallyDeclaredNames
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
LexicallyDeclaredNames
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
LexicallyDeclaredNames
of LabelledItem 를
반환한다.
LabelledItem :
Statement
새로운 빈 리스트 를 반환한다.
LabelledItem :
FunctionDeclaration
BoundNames of FunctionDeclaration 를 반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelLexicallyDeclaredNames
of StatementList 를
반환한다.
참고 1
Script 의 최상위 레벨에서는, 함수 선언이
렉시컬
선언이 아니라 var 선언처럼 취급된다.
참고 2
Module 의
LexicallyDeclaredNames에는 그 안의 모든 import 바인딩의 이름이 포함된다.
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 LexicallyDeclaredNames
of ModuleItemList 로
한다.
names2 를 LexicallyDeclaredNames
of ModuleItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ModuleItem : ImportDeclaration
BoundNames of ImportDeclaration 를
반환한다.
ModuleItem : ExportDeclaration
만약 ExportDeclaration 가
export VariableStatement 인 경우, 새로운 빈
리스트 를 반환한다.
BoundNames of ExportDeclaration 를
반환한다.
ModuleItem : StatementListItem
LexicallyDeclaredNames
of StatementListItem 를 반환한다.
참고 3
Module 의 최상위 레벨에서는, 함수 선언이
var
선언이 아니라 렉시컬 선언처럼 취급된다.
8.2.5 정적 의미론: LexicallyScopedDeclarations
구문 지향 연산
LexicallyScopedDeclarations는 인자를 받지 않으며
리스트 (파스
노드 의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 LexicallyScopedDeclarations
of StatementList 로
한다.
declarations2 를 LexicallyScopedDeclarations
of StatementListItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
StatementListItem
: Statement
만약 Statement 가
Statement
:
LabelledStatement
인 경우, LexicallyScopedDeclarations
of LabelledStatement 를 반환한다.
새로운 빈 리스트 를 반환한다.
StatementListItem
: Declaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
Declaration 이다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
declarations1 을 LexicallyScopedDeclarations
of 첫 번째 CaseClauses 로
한다.
그렇지 않으면, declarations1 을 새로운 빈 리스트 로 한다.
declarations2 를 LexicallyScopedDeclarations
of DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
declarations3 을 LexicallyScopedDeclarations
of 두 번째 CaseClauses 로
한다.
그렇지 않으면, declarations3 을 새로운 빈 리스트 로 한다.
list-concatenation of
declarations1 , declarations2 , declarations3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
declarations1 을 LexicallyScopedDeclarations
of CaseClauses 로 한다.
declarations2 를 LexicallyScopedDeclarations
of CaseClause 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
LexicallyScopedDeclarations
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
LexicallyScopedDeclarations
of StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
LexicallyScopedDeclarations
of LabelledItem 를
반환한다.
LabelledItem :
Statement
새로운 빈 리스트 를 반환한다.
LabelledItem :
FunctionDeclaration
« FunctionDeclaration »를
반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelLexicallyScopedDeclarations
of StatementList 를
반환한다.
Module : [empty]
새로운 빈 리스트 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 을 LexicallyScopedDeclarations
of ModuleItemList 로
한다.
declarations2 를 LexicallyScopedDeclarations
of ModuleItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement
새로운 빈 리스트 를 반환한다.
ExportDeclaration
:
export
Declaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
Declaration 이다.
ExportDeclaration
:
export
default
HoistableDeclaration
리스트 를 반환한다. 유일한
요소는
DeclarationPart
of
HoistableDeclaration 이다.
ExportDeclaration
:
export
default
ClassDeclaration
리스트 를 반환한다. 유일한
요소는
ClassDeclaration 이다.
ExportDeclaration
:
export
default
AssignmentExpression
;
리스트 를 반환한다. 유일한
요소는
이 ExportDeclaration 이다.
8.2.6 정적 의미론: VarDeclaredNames
구문 지향 연산
VarDeclaredNames는 인자를 받지 않으며 문자열의
리스트 를
반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
새로운 빈 리스트 를 반환한다.
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
names1 을 VarDeclaredNames
of
StatementList 로
한다.
names2 를 VarDeclaredNames
of
StatementListItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
StatementListItem
: Declaration
새로운 빈 리스트 를 반환한다.
VariableStatement
:
var
VariableDeclarationList
;
BoundNames of VariableDeclarationList 를
반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
names1 을 VarDeclaredNames
of
첫 번째 Statement 로 한다.
names2 를 VarDeclaredNames
of
두 번째 Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
VarDeclaredNames
of
Statement 를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
names1 을 BoundNames of VariableDeclarationList 로
한다.
names2 를 VarDeclaredNames
of
Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
names1 을 BoundNames of ForBinding 로 한다.
names2 를 VarDeclaredNames
of
Statement 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
VarDeclaredNames
of
Statement 를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
VarDeclaredNames
of
CaseBlock 를 반환한다.
CaseBlock :
{
}
새로운 빈 리스트 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
names1 을 VarDeclaredNames
of
첫 번째 CaseClauses 로
한다.
그렇지 않으면, names1 을 새로운 빈 리스트 로 한다.
names2 를 VarDeclaredNames
of
DefaultClause 로
한다.
두 번째 CaseClauses 가
존재하면,
names3 을 VarDeclaredNames
of
두 번째 CaseClauses 로
한다.
그렇지 않으면, names3 을 새로운 빈 리스트 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
names1 을 VarDeclaredNames
of
CaseClauses 로 한다.
names2 를 VarDeclaredNames
of
CaseClause 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
VarDeclaredNames
of
StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
VarDeclaredNames
of
StatementList 를
반환한다.
새로운 빈 리스트 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
VarDeclaredNames
of
LabelledItem 를
반환한다.
LabelledItem :
FunctionDeclaration
새로운 빈 리스트 를 반환한다.
TryStatement :
try
Block
Catch
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Catch 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
TryStatement :
try
Block
Finally
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Finally 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
TryStatement :
try
Block
Catch
Finally
names1 을 VarDeclaredNames
of
Block 로 한다.
names2 를 VarDeclaredNames
of
Catch 로 한다.
names3 을 VarDeclaredNames
of
Finally 로 한다.
list-concatenation of
names1 , names2 , names3 를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
VarDeclaredNames
of
Block 를 반환한다.
FunctionStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
FunctionStatementList
: StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 리스트 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 리스트 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 리스트 를 반환한다.
Script : [empty]
새로운 빈 리스트 를 반환한다.
ScriptBody : StatementList
TopLevelVarDeclaredNames
of StatementList 를
반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 VarDeclaredNames
of
ModuleItemList 로
한다.
names2 를 VarDeclaredNames
of
ModuleItem 로 한다.
list-concatenation of
names1 과 names2 를 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 리스트 를 반환한다.
ModuleItem : ExportDeclaration
만약 ExportDeclaration 가
export VariableStatement 인 경우,
BoundNames of ExportDeclaration 를
반환한다.
새로운 빈 리스트 를 반환한다.
8.2.7 정적 의미론: VarScopedDeclarations
구문 지향 연산
VarScopedDeclarations는 인자를 받지 않으며
리스트 (파스
노드 의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
새로운 빈 리스트 를 반환한다.
Block :
{
}
새로운 빈 리스트 를 반환한다.
StatementList :
StatementList
StatementListItem
declarations1 을 VarScopedDeclarations
of StatementList 로
한다.
declarations2 를 VarScopedDeclarations
of StatementListItem 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
StatementListItem
: Declaration
새로운 빈 리스트 를 반환한다.
VariableDeclarationList
: VariableDeclaration
« VariableDeclaration »를
반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
declarations1 을 VarScopedDeclarations
of VariableDeclarationList 로
한다.
list-concatenation of
declarations1 과 « VariableDeclaration »를
반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
declarations1 을 VarScopedDeclarations
of 첫 번째 Statement 로
한다.
declarations2 를 VarScopedDeclarations
of 두 번째 Statement 로
한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
VarScopedDeclarations
of Statement 를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
declarations1 을 VarScopedDeclarations
of VariableDeclarationList 로
한다.
declarations2 를 VarScopedDeclarations
of Statement 로 한다.
list-concatenation of
declarations1 과 declarations2 를 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
VarScopedDeclarations
of Statement 를 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
declarations1 을(를) « ForBinding »로 둔다.
declarations2 을(를) VarScopedDeclarations
of Statement 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
VarScopedDeclarations
of Statement 을(를)
반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
VarScopedDeclarations
of CaseBlock 을(를)
반환한다.
CaseBlock :
{
}
새로운 빈 List 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
declarations1 을(를) 첫 번째 VarScopedDeclarations
of CaseClauses 로 둔다.
그렇지 않으면, declarations1 을(를) 새로운 빈 List 로 둔다.
declarations2 을(를) VarScopedDeclarations
of DefaultClause 로
둔다.
두 번째 CaseClauses 가
존재하면,
declarations3 을(를) 두 번째 VarScopedDeclarations
of CaseClauses 로 둔다.
그렇지 않으면, declarations3 을(를) 새로운 빈 List 로 둔다.
list-concatenation 을(를)
declarations1 , declarations2 , declarations3 에 대해
반환한다.
CaseClauses :
CaseClauses
CaseClause
declarations1 을(를) VarScopedDeclarations
of CaseClauses 로 둔다.
declarations2 을(를) VarScopedDeclarations
of CaseClause 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList
가 존재하면, VarScopedDeclarations
of StatementList 을(를)
반환한다.
새로운 빈 List 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList
가 존재하면, VarScopedDeclarations
of StatementList 을(를)
반환한다.
새로운 빈 List 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
VarScopedDeclarations
of LabelledItem 을(를)
반환한다.
LabelledItem :
FunctionDeclaration
새로운 빈 List 를 반환한다.
TryStatement :
try
Block
Catch
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Catch 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
TryStatement :
try
Block
Finally
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Finally 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
TryStatement :
try
Block
Catch
Finally
declarations1 을(를) VarScopedDeclarations
of Block 로 둔다.
declarations2 을(를) VarScopedDeclarations
of Catch 로 둔다.
declarations3 을(를) VarScopedDeclarations
of Finally 로 둔다.
list-concatenation 을(를)
declarations1 , declarations2 , declarations3 에 대해
반환한다.
Catch :
catch
(
CatchParameter
)
Block
VarScopedDeclarations
of Block 을(를) 반환한다.
FunctionStatementList
: [empty]
새로운 빈 List 를 반환한다.
FunctionStatementList
: StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
ClassStaticBlockStatementList
: [empty]
새로운 빈 List 를 반환한다.
ClassStaticBlockStatementList
: StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
ConciseBody :
ExpressionBody
새로운 빈 List 를 반환한다.
AsyncConciseBody
:
ExpressionBody
새로운 빈 List 를 반환한다.
Script : [empty]
새로운 빈 List 를 반환한다.
ScriptBody : StatementList
TopLevelVarScopedDeclarations
of StatementList 를
반환한다.
Module : [empty]
새로운 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 을(를) VarScopedDeclarations
of ModuleItemList 로
둔다.
declarations2 을(를) VarScopedDeclarations
of ModuleItem 로 둔다.
list-concatenation 을(를)
declarations1 과 declarations2 에 대해 반환한다.
ModuleItem : ImportDeclaration
새로운 빈 List 를 반환한다.
ModuleItem : ExportDeclaration
ExportDeclaration 이(가)
export VariableStatement 라면, VarScopedDeclarations
of VariableStatement 을(를) 반환한다.
새로운 빈 List 를 반환한다.
8.2.8 정적 의미론: TopLevelLexicallyDeclaredNames
구문 지시 연산
TopLevelLexicallyDeclaredNames는 인자가 없으며 문자열의 List 를 반환한다. 다음 생성 규칙에
대해
조각별로 정의된다:
StatementList :
StatementList
StatementListItem
names1 을 TopLevelLexicallyDeclaredNames
of StatementList 로
둔다.
names2 를 TopLevelLexicallyDeclaredNames
of StatementListItem 로 둔다.
list-concatenation 을
names1 과
names2 에 대해 반환한다.
StatementListItem
: Statement
새 빈 List 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
새 빈 List 를
반환한다.
BoundNames of Declaration 를 반환한다.
참고
함수나 스크립트의 최상위 레벨에서는 함수 선언이 렉시컬 선언이 아닌 var 선언처럼 취급된다.
8.2.9 정적 의미론: TopLevelLexicallyScopedDeclarations
구문 지시 연산
TopLevelLexicallyScopedDeclarations는 인자가 없으며 List 의 구문
노드 를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 TopLevelLexicallyScopedDeclarations
of StatementList 로
둔다.
declarations2 를 TopLevelLexicallyScopedDeclarations
of StatementListItem 로 둔다.
list-concatenation 을
declarations1 과 declarations2 에 대해 반환한다.
StatementListItem
: Statement
새 빈 List 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
새 빈 List 를
반환한다.
« Declaration »를
반환한다.
8.2.10 정적 의미론: TopLevelVarDeclaredNames
구문 지시 연산
TopLevelVarDeclaredNames는 인자가 없으며 문자열의 List 를 반환한다.
다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
names1 을 TopLevelVarDeclaredNames
of StatementList 로
둔다.
names2 를 TopLevelVarDeclaredNames
of StatementListItem 로 둔다.
list-concatenation 을
names1 과
names2 에 대해 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
BoundNames of
HoistableDeclaration 를
반환한다.
새 빈 List 를 반환한다.
StatementListItem
: Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarDeclaredNames
of Statement 를 반환한다.
VarDeclaredNames
of
Statement 를 반환한다.
참고
함수 또는 스크립트의 최상위 레벨에서 내부 함수 선언은 var 선언으로 취급된다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
TopLevelVarDeclaredNames
of LabelledItem 를
반환한다.
LabelledItem :
Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarDeclaredNames
of Statement 를 반환한다.
VarDeclaredNames
of
Statement 를 반환한다.
LabelledItem :
FunctionDeclaration
BoundNames of FunctionDeclaration 를 반환한다.
8.2.11 정적 의미론: TopLevelVarScopedDeclarations
구문 지시 연산
TopLevelVarScopedDeclarations는 인자를 받지 않고 List 의 파스
노드 를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
StatementList :
StatementList
StatementListItem
declarations1 을 TopLevelVarScopedDeclarations
of StatementList 로
둔다.
declarations2 를 TopLevelVarScopedDeclarations
of StatementListItem 로 둔다.
list-concatenation 을
declarations1 과 declarations2 에 대해 반환한다.
StatementListItem
: Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarScopedDeclarations
of Statement 를 반환한다.
VarScopedDeclarations
of Statement 를 반환한다.
StatementListItem
: Declaration
Declaration 이
Declaration
: HoistableDeclaration
라면,
declaration 을 DeclarationPart
of HoistableDeclaration 로
둔다.
« declaration »를 반환한다.
새 빈 List 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
TopLevelVarScopedDeclarations
of LabelledItem 를
반환한다.
LabelledItem :
Statement
Statement 이
Statement
:
LabelledStatement
라면, TopLevelVarScopedDeclarations
of Statement 를 반환한다.
VarScopedDeclarations
of Statement 를 반환한다.
LabelledItem :
FunctionDeclaration
« FunctionDeclaration »를
반환한다.
8.3 레이블
8.3.1 정적 의미론: ContainsDuplicateLabels
구문 지시 연산
ContainsDuplicateLabels는 labelSet (문자열의 List ) 인자를 받고, Boolean을
반환한다. 이는 다음 생성 규칙에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
StatementList :
StatementList
StatementListItem
hasDuplicates 를 ContainsDuplicateLabels
of StatementList
(인자
labelSet )로 둔다.
만약 hasDuplicates 가 true 라면, true 를
반환한다.
ContainsDuplicateLabels
of StatementListItem (인자
labelSet )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasDuplicate 를 ContainsDuplicateLabels
of 첫 번째 Statement (인자
labelSet )로 둔다.
만약 hasDuplicate 가 true 라면, true 를
반환한다.
두 번째 ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
참고
WithStatement :
with
(
Expression
)
Statement
ContainsDuplicateLabels
of Statement (인자
labelSet )를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsDuplicateLabels
of CaseBlock (인자
labelSet )를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
존재하면,
첫 번째 ContainsDuplicateLabels
of CaseClauses
(인자 labelSet )가 true 라면,
true 를
반환한다.
ContainsDuplicateLabels
of DefaultClause
(인자
labelSet )가 true 라면, true 를 반환한다.
두 번째 CaseClauses 가
존재하지
않으면, false 를 반환한다.
두 번째 ContainsDuplicateLabels
of CaseClauses (인자
labelSet )를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasDuplicates 를 ContainsDuplicateLabels
of CaseClauses (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of CaseClause (인자
labelSet )를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
존재하면,
ContainsDuplicateLabels
of StatementList
(인자
labelSet )를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
존재하면,
ContainsDuplicateLabels
of StatementList
(인자
labelSet )를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue of
LabelIdentifier 로
둔다.
labelSet 에 label 이 포함되어 있으면, true 를 반환한다.
newLabelSet 을 list-concatenation of
labelSet 및 « label »로 둔다.
ContainsDuplicateLabels
of LabelledItem
(인자
newLabelSet )를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasDuplicates 를 ContainsDuplicateLabels
of Block (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Catch (인자
labelSet )를 반환한다.
TryStatement :
try
Block
Finally
hasDuplicates 를 ContainsDuplicateLabels
of Block (인자
labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Finally (인자
labelSet )를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsDuplicateLabels
of Block (인자
labelSet )가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Catch (인자
labelSet )가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of Finally (인자
labelSet )를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsDuplicateLabels
of Block (인자
labelSet )를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasDuplicates 를 ContainsDuplicateLabels
of ModuleItemList
(인자 labelSet )로 둔다.
hasDuplicates 가 true 라면, true 를 반환한다.
ContainsDuplicateLabels
of ModuleItem (인자
labelSet )를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.3.2 정적 의미론: ContainsUndefinedBreakTarget
구문 지향 연산
ContainsUndefinedBreakTarget는 labelSet
(문자열의 List ) 인수를 받고
불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
StatementList :
StatementList
StatementListItem
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(StatementListItem ,
labelSet 인수)를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels 를 첫 번째 Statement
에 labelSet 인수로 ContainsUndefinedBreakTarget 의
결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
두 번째 Statement
에 labelSet 인수로 ContainsUndefinedBreakTarget 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
참고
BreakStatement :
break
;
false 를 반환한다.
BreakStatement :
break
LabelIdentifier
;
labelSet 에 StringValue (LabelIdentifier )가
포함되어
있지 않으면
true 를 반환한다.
false 를 반환한다.
WithStatement :
with
(
Expression
)
Statement
ContainsUndefinedBreakTarget
(Statement ,
labelSet 인수)를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsUndefinedBreakTarget
(CaseBlock ,
labelSet 인수)를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
있으면,
첫 번째 CaseClauses 에
labelSet
인수로 ContainsUndefinedBreakTarget 의
결과가 true 이면 true 를 반환한다.
DefaultClause 에
labelSet 인수로 ContainsUndefinedBreakTarget 의
결과가 true 이면 true 를 반환한다.
두 번째 CaseClauses 가
없으면
false 를 반환한다.
두 번째 CaseClauses 에
labelSet 인수로 ContainsUndefinedBreakTarget 의
결과를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(CaseClauses ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(CaseClause ,
labelSet 인수)를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedBreakTarget
(StatementList ,
labelSet 인수)를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue (LabelIdentifier )로
한다.
newLabelSet 을 list-concatenation (labelSet ,
« label »)로 한다.
ContainsUndefinedBreakTarget
(LabelledItem ,
newLabelSet 인수)를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(Catch ,
labelSet
인수)를 반환한다.
TryStatement :
try
Block
Finally
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(Finally ,
labelSet 인수)를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)가 true 이면 true 를 반환한다.
ContainsUndefinedBreakTarget
(Catch ,
labelSet
인수)가 true 이면 true 를 반환한다.
ContainsUndefinedBreakTarget
(Finally ,
labelSet 인수)를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsUndefinedBreakTarget
(Block ,
labelSet
인수)를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels 를 ContainsUndefinedBreakTarget
(ModuleItemList ,
labelSet 인수)로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedBreakTarget
(ModuleItem ,
labelSet 인수)를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.3.3 정적 의미론: ContainsUndefinedContinueTarget
구문 지향 연산
ContainsUndefinedContinueTarget는
iterationSet (문자열의 List ),
labelSet (문자열의 List )
인수를 받고
불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem
:
Declaration
false 를 반환한다.
Statement : BlockStatement
ContainsUndefinedContinueTarget
(BlockStatement ,
iterationSet , « »)의 결과를 반환한다.
BreakableStatement
: IterationStatement
newIterationSet 을 list-concatenation (iterationSet ,
labelSet )로 한다.
ContainsUndefinedContinueTarget
(IterationStatement ,
newIterationSet , « »)의 결과를 반환한다.
StatementList :
StatementList
StatementListItem
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(StatementListItem ,
iterationSet , « »)의 결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels 를 첫 번째 Statement
에 iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
두 번째 Statement
에 iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
WhileStatement :
while
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
참고
ContinueStatement
:
continue
;
false 를 반환한다.
ContinueStatement
:
continue
LabelIdentifier
;
iterationSet 에 StringValue (LabelIdentifier )가
포함되어
있지 않으면
true 를 반환한다.
false 를 반환한다.
WithStatement :
with
(
Expression
)
Statement
ContainsUndefinedContinueTarget
(Statement ,
iterationSet , « »)의 결과를 반환한다.
SwitchStatement
:
switch
(
Expression
)
CaseBlock
ContainsUndefinedContinueTarget
(CaseBlock ,
iterationSet , « »)의 결과를 반환한다.
CaseBlock :
{
}
false 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
첫 번째 CaseClauses 가
있으면,
첫 번째 CaseClauses 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과가 true 이면 true 를 반환한다.
DefaultClause 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과가 true 이면 true 를 반환한다.
두 번째 CaseClauses 가
없으면
false 를 반환한다.
두 번째 CaseClauses 에
iterationSet , « » 인수로 ContainsUndefinedContinueTarget 의
결과를 반환한다.
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(CaseClauses ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(CaseClause ,
iterationSet , « »)의 결과를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과를 반환한다.
false 를 반환한다.
DefaultClause :
default
:
StatementList opt
StatementList 가
있으면
ContainsUndefinedContinueTarget
(StatementList ,
iterationSet , « »)의 결과를 반환한다.
false 를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 StringValue (LabelIdentifier )로
한다.
newLabelSet 을 list-concatenation (labelSet ,
« label »)로 한다.
ContainsUndefinedContinueTarget
(LabelledItem ,
iterationSet , newLabelSet )의 결과를 반환한다.
LabelledItem :
FunctionDeclaration
false 를 반환한다.
TryStatement :
try
Block
Catch
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(Catch ,
iterationSet , « »)의 결과를 반환한다.
TryStatement :
try
Block
Finally
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(Finally ,
iterationSet , « »)의 결과를 반환한다.
TryStatement :
try
Block
Catch
Finally
ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과가 true 이면
true 를 반환한다.
ContainsUndefinedContinueTarget
(Catch ,
iterationSet , « »)의 결과가 true 이면
true 를 반환한다.
ContainsUndefinedContinueTarget
(Finally ,
iterationSet , « »)의 결과를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
ContainsUndefinedContinueTarget
(Block ,
iterationSet , « »)의 결과를 반환한다.
FunctionStatementList
: [empty]
false 를 반환한다.
ClassStaticBlockStatementList
: [empty]
false 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels 를 ContainsUndefinedContinueTarget
(ModuleItemList ,
iterationSet , « »)의 결과로 한다.
hasUndefinedLabels 가 true 이면,
true 를 반환한다.
ContainsUndefinedContinueTarget
(ModuleItem ,
iterationSet , « »)의 결과를 반환한다.
ModuleItem :
ImportDeclaration
ExportDeclaration
false 를 반환한다.
8.4 함수 이름 추론
8.4.1 정적 의미론: HasName
구문 지향 연산
HasName은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
IsFunctionDefinition 의
expr 값이 false 이면, false 를 반환한다.
expr 에 대한 HasName 의 값을 반환한다.
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
ArrowFunction :
ArrowParameters
=>
ConciseBody
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
ClassExpression
:
class
ClassTail
false 를 반환한다.
FunctionExpression
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression
:
class
BindingIdentifier
ClassTail
true 를 반환한다.
8.4.2 정적 의미론: IsFunctionDefinition
구문 지향 연산
IsFunctionDefinition은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
expr 에 대한 IsFunctionDefinition
값을 반환한다.
PrimaryExpression
:
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
UpdateExpression
:
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
:
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
AssignmentExpression
:
YieldExpression
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression :
Expression
,
AssignmentExpression
false 를 반환한다.
AssignmentExpression
:
ArrowFunction
AsyncArrowFunction
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression
:
class
BindingIdentifier opt
ClassTail
true 를 반환한다.
8.4.3 정적 의미론: IsAnonymousFunctionDefinition (
expr )
추상 연산 IsAnonymousFunctionDefinition은 expr ( AssignmentExpression
파스
노드 , Initializer 파스
노드 , 또는 Expression 파스
노드 ) 인수를 받고 불리언을 반환한다. 이
연산은 인수가 이름을 바인딩하지 않는 함수 정의인지 판별한다. 호출 시 다음 단계를 수행한다:
IsFunctionDefinition
(expr )이 false 이면, false 를 반환한다.
hasName 을 HasName (expr )로
한다.
hasName 이 true 이면, false 를 반환한다.
true 를 반환한다.
8.4.4 정적 의미론: IsIdentifierRef
구문 지향 연산
IsIdentifierRef는 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:
PrimaryExpression
: IdentifierReference
true 를 반환한다.
PrimaryExpression
:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
false 를 반환한다.
8.4.5 실행 의미론: NamedEvaluation
구문 지향 연산
NamedEvaluation은 name ( 프로퍼티 키 또는 Private Name ) 인수를 받고
정상 완료 값을 포함한
함수
객체 또는
급작스런 완료 를 반환한다. 다음 생성
규칙에
대해 조각별로 정의된다:
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
한다.
이는 Cover 된 CoverParenthesizedExpressionAndArrowParameterList 이다.
? NamedEvaluation (expr ,
name )의 결과를 반환한다.
ParenthesizedExpression
:
(
Expression
)
Assert :
IsAnonymousFunctionDefinition (Expression )이
true 이다.
? NamedEvaluation (Expression ,
name )의 결과를 반환한다.
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionExpression
(FunctionExpression ,
name )의 결과를 반환한다.
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionExpression
(GeneratorExpression ,
name )의 결과를 반환한다.
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionExpression
(AsyncGeneratorExpression ,
name )의 결과를 반환한다.
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionExpression
(AsyncFunctionExpression ,
name )의 결과를 반환한다.
ArrowFunction :
ArrowParameters
=>
ConciseBody
InstantiateArrowFunctionExpression
(ArrowFunction ,
name )의 결과를 반환한다.
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
InstantiateAsyncArrowFunctionExpression
(AsyncArrowFunction ,
name )의 결과를 반환한다.
ClassExpression
:
class
ClassTail
value 를 ? ClassDefinitionEvaluation (ClassTail ,
undefined , name )의 결과로 한다.
value .[[SourceText]] 를 source text
matched
by ClassExpression 로 설정한다.
value 를 반환한다.
8.5 포함(Contains)
8.5.1 정적 의미: 포함(Contains)
구문 지향 연산
Contains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다.
아래에 명시되지 않은 이 명세의 모든 문법 생성 alternative는 암묵적으로 다음과 같은 기본 Contains 정의를 가진다:
이 파스 노드(Parse Node) 의 각 자식 노드
child 에 대해, 다음을 수행한다:
child 가 symbol 의 인스턴스라면, true 를 반환한다.
child 가 비단말(nonterminal)의 인스턴스라면,
contained 를 child Contains
symbol 의 결과로 둔다.
contained 가 true 이면
true 를
반환한다.
false 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
참고 1
하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 함수 정의 내부를 들여다보지 않는다.
ClassTail :
ClassHeritage opt
{
ClassBody
}
symbol 이 ClassBody 라면, true 를
반환한다.
symbol 이 ClassHeritage 라면, 다음을 수행한다:
ClassHeritage 가 존재하면
true 를, 그렇지 않으면 false 를 반환한다.
ClassHeritage 가
존재하면,
다음을 수행한다:
ClassHeritage
Contains
symbol 이 true 라면 true 를 반환한다.
ClassBody 의 ComputedPropertyContains
결과를 symbol 인자로 반환한다.
참고 2
하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 PropertyName 을 제외하고 클래스 바디 내부를 들여다보지
않는다.
ClassStaticBlock
:
static
{
ClassStaticBlockBody
}
false 를 반환한다.
참고 3
하위 구조에 의존하는 정적 의미 규칙들은 static 초기화 블록 내부를 일반적으로 들여다보지 않는다.
ArrowFunction :
ArrowParameters
=>
ConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
ArrowParameters
Contains
symbol
이 true 라면, true 를 반환한다.
ConciseBody
Contains
symbol 의
결과를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 두는데,
이는
covered 된 CoverParenthesizedExpressionAndArrowParameterList 에서
나온다.
formals Contains
symbol 의
결과를 반환한다.
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
AsyncConciseBody
Contains
symbol 의
결과를 반환한다.
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
symbol 이 NewTarget , SuperProperty , SuperCall ,
super, 또는 this 중 하나가 아니라면 false 를 반환한다.
head 를 AsyncArrowHead 로 두는데, 이는 covered 된 CoverCallExpressionAndAsyncArrowHead 에서
나온다.
head Contains
symbol
이 true 라면, true 를 반환한다.
AsyncConciseBody
Contains
symbol 의
결과를 반환한다.
참고 4
Contains는 ArrowFunction 또는 AsyncArrowFunction
내에서 new.target, this, super 사용을 감지하는 데 사용된다.
PropertyDefinition
: MethodDefinition
symbol 이 MethodDefinition 라면
true 를 반환한다.
MethodDefinition 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
LiteralPropertyName
: IdentifierName
false 를 반환한다.
MemberExpression
:
MemberExpression
.
IdentifierName
MemberExpression
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
SuperProperty :
super
.
IdentifierName
symbol 이 ReservedWord super라면
true 를 반환한다.
false 를 반환한다.
CallExpression :
CallExpression
.
IdentifierName
CallExpression
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
OptionalChain :
?.
IdentifierName
false 를 반환한다.
OptionalChain :
OptionalChain
.
IdentifierName
OptionalChain
Contains
symbol
이 true 라면, true 를 반환한다.
false 를 반환한다.
8.5.2 정적 의미: ComputedPropertyContains
구문 지향 연산
ComputedPropertyContains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다. 이 연산은 아래의 생성 규칙들에
대해
부분적으로 정의된다.
ClassElementName
:
PrivateIdentifier
PropertyName :
LiteralPropertyName
false 를 반환한다.
PropertyName :
ComputedPropertyName
ComputedPropertyName
Contains
symbol 의
결과를 반환한다.
MethodDefinition
:
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
GeneratorMethod
:
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
ClassElementList
:
ClassElementList
ClassElement
inList 를 ClassElementList 의 ComputedPropertyContains
결과로 symbol 인자를 사용하여 구한다.
inList 가 true 라면, true 를 반환한다.
ClassElement 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
ClassElement :
ClassStaticBlock
false 를 반환한다.
ClassElement :
;
false 를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
FieldDefinition
:
ClassElementName
Initializer opt
ClassElementName 의
ComputedPropertyContains
결과를 symbol 인자로 반환한다.
8.6 기타
이 연산들은 명세 전반의 여러 곳에서 사용됩니다.
8.6.1 런타임 의미론: InstantiateFunctionObject
구문 지시 연산
InstantiateFunctionObject는 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 이는 다음 생성 규칙에 따라
부분적으로 정의됩니다:
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionObject
를 FunctionDeclaration 에 대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionObject
를 GeneratorDeclaration 에 대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionObject
를 AsyncGeneratorDeclaration
에 대해 env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionObject
를 AsyncFunctionDeclaration 에
대해
env 와 privateEnv 인자를 넣어 호출한 결과를 반환한다.
8.6.2 런타임 의미론: BindingInitialization
구문 지시 연산
BindingInitialization은 value (ECMAScript 언어 값 )과
environment (Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료 또는 비정상 완료
중
하나를 반환한다.
참고
environment 에 undefined 가 전달되는 것은 초기화 값을 할당할 때 PutValue
연산을
사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수 의 명시적 매개변수
목록(자세한
내용은 10.2.11 참고)에
해당한다.
이런 경우 렉시컬 바인딩이 호이스팅되고, 초기화식이 평가되기 전에 미리 초기화된다.
다음 생성 규칙에 따라 부분적으로 정의된다:
BindingIdentifier
: Identifier
name 을 StringValue of
Identifier 로 둔다.
? InitializeBoundName (name ,
value , environment )를 반환한다.
BindingIdentifier
: yield
? InitializeBoundName ("yield" ,
value , environment )를 반환한다.
BindingIdentifier
: await
? InitializeBoundName ("await" ,
value , environment )를 반환한다.
BindingPattern :
ObjectBindingPattern
? RequireObjectCoercible (value )를
수행한다.
? BindingInitialization of ObjectBindingPattern 를
value , environment 인자로 호출한 결과를 반환한다.
BindingPattern :
ArrayBindingPattern
iteratorRecord 를 ? GetIterator (value ,
sync )로 둔다.
result 를 Completion (IteratorBindingInitialization of ArrayBindingPattern
를 iteratorRecord , environment 인자로 호출)로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
? result 를 반환한다.
ObjectBindingPattern
:
{
}
unused 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
}
{
BindingPropertyList
,
}
? PropertyBindingInitialization of BindingPropertyList
를 value , environment 인자로 호출한다.
unused 를 반환한다.
ObjectBindingPattern
:
{
BindingRestProperty
}
excludedNames 를 새로운 빈 List 로 둔다.
? RestBindingInitialization of BindingRestProperty
를 value , environment , excludedNames 인자로 호출한 결과를
반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
excludedNames 를 ? PropertyBindingInitialization of BindingPropertyList
를 value , environment 인자로 호출한 결과로 둔다.
? RestBindingInitialization of BindingRestProperty
를 value , environment , excludedNames 인자로 호출한 결과를
반환한다.
8.6.2.1 InitializeBoundName ( name ,
value ,
environment )
추상 연산 InitializeBoundName은 name (문자열),
value (ECMAScript 언어 값 ), 그리고
environment (Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료
또는 비정상 완료 중 하나를
반환한다.
다음 단계를 수행한다:
만약 environment 가 undefined 가 아니라면,
! environment .InitializeBinding(name ,
value )을 수행한다.
unused 를 반환한다.
그 외의 경우,
lhs 를 ? ResolveBinding (name )로
둔다.
? PutValue (lhs ,
value )를 반환한다.
8.6.3 런타임 의미론: IteratorBindingInitialization
구문 지시 연산
IteratorBindingInitialization은
iteratorRecord (Iterator Record 타입)와
environment
(Environment Record 또는
undefined ) 인자를 받고, unused를 포함하는 정상
완료 또는 비정상 완료
중
하나를 반환한다.
참고
environment 에 undefined 가 전달될 경우, 초기화 값 할당에 PutValue
연산을
사용해야 함을 나타낸다. 이는 비엄격 함수 의 명시적 매개변수 목록에 해당한다. 이 경우
동일한
이름의 매개변수가 여러 개 있을 수 있으므로, 명시적 매개변수 바인딩을 미리 초기화한다.
다음 생성 규칙에 따라 부분적으로 정의된다:
ArrayBindingPattern
:
[
]
unused 를 반환한다.
ArrayBindingPattern
:
[
Elision
]
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
만약 Elision 이 존재한다면,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingRestElement
에 iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision
]
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
만약 Elision 이 존재한다면,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingRestElement
에 iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
? IteratorBindingInitialization of BindingElementList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingElisionElement 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
BindingElisionElement
:
Elision
BindingElement
? IteratorDestructuringAssignmentEvaluation
of
Elision 에
iteratorRecord 인자를 넣어 호출한다.
? IteratorBindingInitialization of BindingElement 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
bindingId 를 StringValue of
BindingIdentifier 로
둔다.
lhs 를 ? ResolveBinding (bindingId ,
environment )로 둔다.
v 를 undefined 로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
만약 Initializer 가
존재하고
v 가 undefined 라면,
만약 IsAnonymousFunctionDefinition (Initializer )가
true 라면,
v 에 ? NamedEvaluation of
Initializer
를 bindingId 인자로 호출한 결과를 할당한다.
그 외의 경우,
defaultValue 를 ? Evaluation of Initializer 로 둔다.
v 에 ? GetValue (defaultValue )를
할당한다.
만약 environment 가 undefined 라면, ? PutValue (lhs , v )를
반환한다.
? InitializeReferencedBinding (lhs ,
v )를 반환한다.
BindingElement :
BindingPattern
Initializer opt
v 를 undefined 로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
만약 Initializer 가
존재하고
v 가 undefined 라면,
defaultValue 를 ? Evaluation of
Initializer 로
둔다.
v 에 ? GetValue (defaultValue )를
할당한다.
? BindingInitialization of BindingPattern 에
v , environment 인자를 넣어 호출한 결과를 반환한다.
BindingRestElement
:
...
BindingIdentifier
lhs 를 ? ResolveBinding (StringValue of
BindingIdentifier ,
environment )로 둔다.
A 를 ! ArrayCreate (0)로 둔다.
n 을 0으로 둔다.
반복,
next 를 done 으로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이라면,
만약 environment 가 undefined 라면,
? PutValue (lhs ,
A )를 반환한다.
? InitializeReferencedBinding (lhs ,
A )를 반환한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next ))를 수행한다.
n 을 n + 1로 갱신한다.
BindingRestElement
:
...
BindingPattern
A 를 ! ArrayCreate (0)로 둔다.
n 을 0으로 둔다.
반복,
next 를 done 으로 둔다.
만약 iteratorRecord .[[Done]] 이
false 라면,
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이라면,
? BindingInitialization of
BindingPattern 에
A , environment 인자를 넣어 호출한 결과를 반환한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next ))를 수행한다.
n 을 n + 1로 갱신한다.
FormalParameters
:
[empty]
unused 를 반환한다.
FormalParameters
:
FormalParameterList
,
FunctionRestParameter
? IteratorBindingInitialization of FormalParameterList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of FunctionRestParameter 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
? IteratorBindingInitialization of FormalParameterList
에 iteratorRecord , environment 인자를 넣어 호출한다.
? IteratorBindingInitialization of FormalParameter 에
iteratorRecord , environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters
:
BindingIdentifier
v 를 undefined 로 둔다.
Assert :
iteratorRecord .[[Done]] 이
false 임을
보장한다.
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
? BindingInitialization of BindingIdentifier
에 v , environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters
:
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 두는데,
이는 covered by CoverParenthesizedExpressionAndArrowParameterList 에
해당한다.
? IteratorBindingInitialization of
formals 에 iteratorRecord , environment 인자를 넣어 호출한 결과를
반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
v 를 undefined 로 둔다.
Assert :
iteratorRecord .[[Done]] 이
false 임을
보장한다.
next 를 ? IteratorStepValue (iteratorRecord )로
둔다.
만약 next 가 done 이 아니라면,
v 에 next 를 할당한다.
? BindingInitialization of BindingIdentifier
에 v , environment 인자를 넣어 호출한 결과를 반환한다.
8.6.4 정적 의미론: AssignmentTargetType
구문 지시 연산
AssignmentTargetType은 인자를 받지 않으며,
simple , web-compat , 또는
invalid 중 하나를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:
IdentifierReference
: Identifier
만약 IsStrict (이 IdentifierReference )가
true 이고, StringValue of
Identifier 가
"eval" 또는 "arguments" 인 경우,
invalid 를 반환한다.
simple 를 반환한다.
IdentifierReference
:
yield
await
CallExpression :
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MemberExpression
.
PrivateIdentifier
simple 를 반환한다.
PrimaryExpression
:
CoverParenthesizedExpressionAndArrowParameterList
expr 을 ParenthesizedExpression 로
두는데,
이는 covered by CoverParenthesizedExpressionAndArrowParameterList 에
해당한다.
expr 의 AssignmentTargetType 을
반환한다.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
만약
host 가 웹 브라우저이거나
함수
호출 할당 대상에 대한 런타임 오류 를 지원하고,
IsStrict (이
CallExpression )가
false 라면,
web-compat 를 반환한다.
invalid 를 반환한다.
PrimaryExpression
:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CallExpression :
SuperCall
ImportCall
CallExpression
TemplateLiteral
NewExpression :
new
NewExpression
MemberExpression
:
MemberExpression
TemplateLiteral
new
MemberExpression
Arguments
NewTarget :
new
.
target
ImportMeta :
import
.
meta
LeftHandSideExpression
:
OptionalExpression
UpdateExpression
:
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
:
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
AssignmentExpression
:
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression :
Expression
,
AssignmentExpression
invalid 를 반환한다.
8.6.5 정적 의미론: PropName
구문 지시 연산
PropName은 인자를 받지 않으며, 문자열 또는 empty 를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:
PropertyDefinition
: IdentifierReference
IdentifierReference 의 StringValue 를 반환한다.
PropertyDefinition
:
...
AssignmentExpression
empty 를 반환한다.
PropertyDefinition
:
PropertyName
:
AssignmentExpression
PropertyName 의
PropName 을 반환한다.
LiteralPropertyName
: IdentifierName
AttributeKey :
IdentifierName
IdentifierName 의
StringValue 를 반환한다.
LiteralPropertyName
: StringLiteral
AttributeKey :
StringLiteral
StringLiteral 의
SV 를
반환한다.
LiteralPropertyName
: NumericLiteral
nbr 를 NumericLiteral 의 NumericValue 로 둔다.
! ToString (nbr )을 반환한다.
ComputedPropertyName
:
[
AssignmentExpression
]
empty 를 반환한다.
MethodDefinition
:
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName 의
PropName 을 반환한다.
GeneratorMethod
:
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName 의
PropName 을 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
PropName 을 반환한다.
ClassElement :
ClassStaticBlock
empty 를 반환한다.
ClassElement :
;
empty 를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
PropName 을 반환한다.
FieldDefinition
:
ClassElementName
Initializer opt
ClassElementName 의
PropName 을 반환한다.
ClassElementName
:
PrivateIdentifier
empty 를 반환한다.
9 실행 가능한 코드와 실행 컨텍스트
9.1 환경 레코드
Environment Record 는 ECMAScript 코드의 렉시컬 중첩
구조에
기반하여 Identifier 들을 특정 변수와 함수에
연관시키기
위해 사용되는 명세 타입입니다. 보통 환경 레코드는 FunctionDeclaration , BlockStatement , 또는 Catch 절과 같이 ECMAScript 코드의 특정 구문 구조와
연결됩니다.
이와 같은 코드가 평가될 때마다, 해당 코드가 생성하는 식별자 바인딩을 기록하기 위해 새로운 환경 레코드가 생성됩니다.
모든 환경 레코드는 [[OuterEnv]] 필드를 가지며, 이 값은 null 이거나 외부 환경
레코드를
참조합니다. 이 필드는 환경 레코드 값들의 논리적 중첩 구조를 모델링하는 데 사용됩니다. (내부) 환경 레코드의 외부 참조는 논리적으로 그 내부 환경 레코드를 둘러싸는 환경
레코드를 참조합니다. 외부 환경 레코드는 물론 그 자체로 또 다른 외부 환경 레코드를 가질 수 있습니다. 하나의 환경 레코드는 여러 내부 환경 레코드의 외부 환경이 될 수
있습니다. 예를 들어, FunctionDeclaration 이 두 개의 중첩된 FunctionDeclaration 을 포함한다면,
각
중첩 함수의 환경 레코드는 현재 평가 중인 외부 함수의 환경 레코드를 외부 환경 레코드로 갖게 됩니다.
환경 레코드는 오직 명세상의 메커니즘일 뿐이며, ECMAScript 구현의 어떤 특정 산출물과 반드시 대응할 필요는 없습니다. ECMAScript 프로그램이 이러한 값을
직접적으로
접근하거나 조작하는 것은 불가능합니다.
9.1.1 환경 레코드 타입 계층
환경
레코드 는 Environment Record 가 추상 클래스이고, 세 가지
구체적 하위
클래스를 가지는 단순한 객체 지향 계층으로 생각할 수 있습니다: 선언적 환경 레코드 ,
객체 환경 레코드 , 그리고 전역 환경 레코드 . 함수 환경 레코드 와 모듈 환경 레코드 는 선언적 환경 레코드 의 하위 클래스입니다.
환경
레코드 추상 클래스에는 표 16 에 정의된 추상 명세
메서드가 포함되어 있습니다. 이 추상 메서드들은 각 구체적 하위 클래스마다 서로 다른 구체적 알고리즘을 가집니다.
표 16: 환경 레코드 의 추상 메서드
메서드
목적
HasBinding(N)
환경 레코드 가 문자열 값
N 에 대한 바인딩을 가지고 있는지 확인합니다. 가지고 있다면 true 를,
아니라면
false 를 반환합니다.
CreateMutableBinding(N, D)
환경 레코드 에 새로운(아직
초기화되지
않은) 변경 가능한 바인딩을 생성합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. 불리언 인자
D 가 true 라면, 이 바인딩은 이후 삭제될 수 있습니다.
CreateImmutableBinding(N, S)
환경 레코드 에 새로운(아직
초기화되지
않은) 변경 불가능한 바인딩을 생성합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다.
S 가
true 라면, 초기화 후 값을 설정하려는 시도는 엄격 모드 여부와 관계없이 항상 예외를
발생시킵니다.
InitializeBinding(N, V)
환경 레코드 에 이미 존재하지만
아직
초기화되지 않은 바인딩의 값을 설정합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다.
V 는
바인딩에 대한 값이며, ECMAScript
언어
타입 의 값입니다.
SetMutableBinding(N, V, S)
환경 레코드 에 이미 존재하는
변경
가능한 바인딩의 값을 설정합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. V 는
바인딩에
대한 값이며, ECMAScript
언어
타입 의 값일 수 있습니다. S 는 불리언
플래그입니다. S 가 true 이며 바인딩에 값을 설정할 수 없으면
TypeError 예외를 발생시킵니다.
GetBindingValue(N, S)
환경 레코드 에서 이미 존재하는
바인딩의
값을 반환합니다. 문자열 값 N 은 바인딩될 이름의 텍스트입니다. S 는 엄격 모드 코드 에서 시작되었거나 엄격
모드
참조语 의미가 요구되는 참조를 식별하는 데 사용됩니다. S 가 true 이고
바인딩이
존재하지 않으면 ReferenceError 예외를 발생시킵니다. 바인딩이 존재하지만 초기화되지
않았다면
S 의 값과 상관없이 ReferenceError 가 발생합니다.
DeleteBinding(N)
환경 레코드 에서 바인딩을
삭제합니다.
문자열 값 N 은 바인딩될 이름의 텍스트입니다. N 에 대한 바인딩이 존재하면 해당 바인딩을
제거하고
true 를 반환합니다. 바인딩이 존재하나 삭제할 수 없는 경우
false 를 반환합니다. 바인딩이 존재하지 않으면 true 를
반환합니다.
HasThisBinding()
환경 레코드 가
this 바인딩을 설정하는지 확인합니다. 그렇다면 true , 아니라면
false 를 반환합니다.
HasSuperBinding()
환경 레코드 가
super 메서드 바인딩을 설정하는지 확인합니다. 그렇다면 true ,
아니라면
false 를 반환합니다. true 를 반환한다면
환경 레코드 가 함수 환경
레코드 임을
의미하지만, 그 역은 성립하지 않습니다.
WithBaseObject()
이 환경 레코드 가
with 문과 연관되어 있다면, with 객체를 반환합니다. 그렇지 않으면
undefined 를 반환합니다.
9.1.1.1 선언적 환경 레코드
각 선언적 환경 레코드 는 변수, 상수,
let, class, module, import, 그리고/또는 함수 선언을 포함하는 ECMAScript 프로그램 스코프와 연관되어 있습니다. 선언적 환경
레코드는 그
스코프 내에 포함된 선언들이 정의하는 식별자 집합을 바인딩합니다.
9.1.1.1.1 HasBinding ( N )
선언적 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료 를
반환합니다. 이 메서드는 인자로 받은 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다. 호출 시 다음 단계를 수행합니다:
envRec 가 N 에 대한 바인딩을 가지고 있다면 true 를
반환한다.
false 를 반환한다.
9.1.1.1.2 CreateMutableBinding ( N ,
D
)
선언적 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 를 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 가능한 바인딩을
생성합니다. 이
환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. D 가 true 이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다.
호출 시
다음 단계를 수행합니다:
Assert :
envRec 가 이미 N 에 대한 바인딩을 가지고 있지 않음을 보장한다.
envRec 에 대해 N 에 대한 변경 가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다.
D 가 true 이면, 새로 생성된 바인딩이 이후 DeleteBinding 호출로
삭제될 수
있음을 기록한다.
unused 를 반환한다.
9.1.1.1.3 CreateImmutableBinding ( N ,
S )
선언적 환경 레코드
envRec 의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S
(불리언)를 인자로 받아 unused를 포함하는
정상
완료 를 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 불가능한 바인딩을
생성합니다. 이
환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을
표시합니다.
호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 이미 N 에 대한 바인딩을 가지고 있지 않음을 보장한다.
envRec 에 대해 N 에 대한 변경 불가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다.
S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을 기록한다.
unused 를 반환한다.
9.1.1.1.4 InitializeBinding ( N , V
)
선언적 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 를 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩의 값을
V 로
설정합니다. N 에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 에 N 에 대한 초기화되지 않은 바인딩이 존재함을 보장한다.
envRec 내 N 에 대한 바인딩 값을 V 로 설정한다.
envRec 내 N 에 대한 바인딩이 초기화되었음을 기록한다.
unused 를 반환한다.
9.1.1.1.5 SetMutableBinding ( N ,
V ,
S )
선언적 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩의 값을
V 로 변경하려고 시도합니다. N 에 대한 바인딩이 보통 이미 존재하지만, 드물게 존재하지 않을 수도 있습니다.
바인딩이
변경 불가능한 경우 S 가 true 이면 TypeError 를
발생시킵니다.
호출 시 다음 단계를 수행합니다:
만약 envRec 에
N 에
대한 바인딩이 존재하지 않는다면,
S 가 true 이면
ReferenceError 예외를 발생시킨다.
! envRec .CreateMutableBinding(N ,
true )을 수행한다.
! envRec .InitializeBinding(N ,
V )을
수행한다.
unused 를 반환한다.
envRec 내 N 에 대한 바인딩이 strict 바인딩이라면, S 를
true 로 설정한다.
envRec 내 N 에 대한 바인딩이 아직 초기화되지 않았다면,
ReferenceError 예외를 발생시킨다.
그 외에 envRec 내 N 에 대한 바인딩이 변경 가능한 바인딩이라면,
그 값을 V 로 변경한다.
그 외의 경우,
Assert : 이는 변경 불가능한 바인딩의 값을
변경하려는
시도임을 보장한다.
S 가 true 이면 TypeError
예외를
발생시킨다.
unused 를 반환한다.
참고
다음과 같은 ECMAScript 코드는 1 단계에서
바인딩이 존재하지 않게 되는 결과를 초래할 수 있습니다:
function f ( ) { eval ("var x; x = (delete x, 0);" ); }
9.1.1.1.6 GetBindingValue ( N , S )
선언적 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
바인딩이 존재하지만 아직 초기화되지 않았다면 S 값과 무관하게 ReferenceError 예외가
발생합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 N 에 대한 바인딩을 가지고 있음을 보장한다.
envRec 내 N 에 대한 바인딩이 초기화되지 않았다면
ReferenceError 예외를 발생시킨다.
envRec 내 N 에 현재 바인딩된 값을 반환한다.
9.1.1.1.7 DeleteBinding ( N )
선언적 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료 를
반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 가 N 에 대한 바인딩을 가지고 있음을 보장한다.
envRec 내 N 에 대한 바인딩을 삭제할 수 없다면
false 를
반환한다.
envRec 에서 N 에 대한 바인딩을 제거한다.
true 를 반환한다.
9.1.1.1.8 HasThisBinding ( )
선언적 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
일반적인 선언적 환경
레코드
(즉, 함수 환경 레코드 나
모듈 환경 레코드 가 아닌
것)는
this 바인딩을 제공하지 않습니다.
9.1.1.1.9 HasSuperBinding ( )
선언적 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
일반적인 선언적 환경
레코드
(즉, 함수 환경 레코드 나
모듈 환경 레코드 가 아닌
것)는
super 바인딩을 제공하지 않습니다.
9.1.1.1.10 WithBaseObject ( )
선언적 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 undefined 를
반환합니다.
호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.2 객체 환경 레코드
각 객체 환경 레코드 는 자신의 바인딩
객체 라 불리는 객체와 연관되어 있습니다. 객체 환경 레코드는 바인딩 객체의 프로퍼티 이름에 직접적으로 대응하는 문자열 식별자 이름 집합을
바인딩합니다. 프로퍼티
키 중 IdentifierName 형태의 문자열이 아닌 것들은 바인딩된 식별자
집합에
포함되지 않습니다. 자신의 [[Enumerable]] 특성 설정과 상관없이 소유 및 상속된 프로퍼티 모두 집합에
포함됩니다. 객체에 프로퍼티가 동적으로 추가되거나 삭제될 수 있기 때문에, 객체 환경 레코드에 바인딩된 식별자 집합은 프로퍼티 추가/삭제 연산의 부수 효과로
잠재적으로 변경될 수 있습니다. 이런 부수 효과로 생성된 모든 바인딩은 해당 프로퍼티의 Writable 특성이
false 이어도 변경
가능한 바인딩으로 간주합니다. 객체 환경 레코드에는 변경 불가능한(immutable) 바인딩이 존재하지 않습니다.
with 문(14.11 )을 위해 생성된 객체 환경 레코드는 바인딩 객체를 함수
호출에서
암시적 this 값으로 제공할 수 있습니다. 이 기능은 불리언 타입의 [[IsWithEnvironment]] 필드로 제어됩니다.
객체 환경 레코드는 표
17 에 나열된 추가 상태 필드를 가집니다.
표 17: 객체 환경 레코드 의 추가 필드
필드 이름
값
의미
[[BindingObject]]
객체
이 환경 레코드 의 바인딩
객체.
[[IsWithEnvironment]]
불리언
이 환경 레코드 가
with 문을 위해 생성된 것인지를 나타냅니다.
9.1.1.2.1 HasBinding ( N )
객체 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 연관된 바인딩 객체에 N 이라는 이름의
프로퍼티가
존재하는지 판단합니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
foundBinding 를 ? HasProperty (bindingObject ,
N )로 둔다.
foundBinding 이 false 라면
false 를
반환한다.
envRec .[[IsWithEnvironment]] 가
false 라면 true 를 반환한다.
unscopables 를 ? Get (bindingObject ,
%Symbol.unscopables% )로
둔다.
unscopables 가 객체 라면,
blocked 를 ToBoolean (? Get (unscopables ,
N ))로 둔다.
blocked 가 true 라면
false 를
반환한다.
true 를 반환한다.
9.1.1.2.2 CreateMutableBinding ( N ,
D
)
객체 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 환경
레코드 와 연관된 바인딩 객체에 N 이라는 이름의 프로퍼티를 생성하고, 그 값을
undefined 로 초기화합니다. D 가 true 면 새 프로퍼티의
[[Configurable]] 특성을 true 로, 아니면
false 로 설정합니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
? DefinePropertyOrThrow (bindingObject ,
N , PropertyDescriptor { [[Value]] :
undefined , [[Writable]] :
true , [[Enumerable]] :
true , [[Configurable]] :
D })를 수행한다.
unused 를 반환한다.
참고
보통 envRec 는 N 에 대한 바인딩을 갖지 않지만, 만약 갖고 있다면 DefinePropertyOrThrow 의
의미론에 따라 기존 바인딩이 대체되거나 가려지거나, 비정상
완료 가
반환될 수 있습니다.
9.1.1.2.3 CreateImmutableBinding ( N ,
S )
객체 환경 레코드 의
CreateImmutableBinding 구체 메서드는 이 명세 안에서 사용되지 않습니다.
9.1.1.2.4 InitializeBinding ( N , V
)
객체 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 설정합니다. 호출 시 다음 단계를 수행합니다:
? envRec .SetMutableBinding (N ,
V , false )을 수행한다.
unused 를 반환한다.
참고
이 명세에서 객체 환경 레코드에 대한 CreateMutableBinding의 모든 사용은 곧바로 같은 이름에 대해
InitializeBinding을 호출합니다. 따라서 이 명세는 객체 환경 레코드 의 바인딩
초기화
상태를 명시적으로 추적하지 않습니다.
9.1.1.2.5 SetMutableBinding ( N ,
V ,
S )
객체 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 환경
레코드 와 연관된 바인딩 객체의 N 이라는 이름의 프로퍼티 값을 V 로
설정하려고
시도합니다. N 이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 오류 처리는
S 에
따라 결정됩니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
stillExists 를 ? HasProperty (bindingObject ,
N )로 둔다.
stillExists 가 false 이고 S 가
true 라면 ReferenceError 예외를 발생시킨다.
? Set (bindingObject ,
N , V , S )를 수행한다.
unused 를 반환한다.
9.1.1.2.6 GetBindingValue ( N , S )
객체 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 연관된 바인딩 객체의 N 이름의 프로퍼티
값을
반환합니다. 프로퍼티는 이미 존재해야 하지만, 존재하지 않을 경우 결과는 S 에 따라 달라집니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
value 를 ? HasProperty (bindingObject ,
N )로 둔다.
value 가 false 라면,
S 가 false 라면
undefined 를
반환하고, 아니면 ReferenceError 예외를 발생시킨다.
? Get (bindingObject ,
N )를 반환한다.
9.1.1.2.7 DeleteBinding ( N )
객체 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 환경 객체의 [[Configurable]] 특성이 true 인 프로퍼티에 대응되는
바인딩만
삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:
bindingObject 를 envRec .[[BindingObject]] 로 둔다.
? bindingObject .[[Delete]] (N )를 반환한다.
9.1.1.2.8 HasThisBinding ( )
객체 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
객체 환경 레코드 는
this 바인딩을 제공하지 않습니다.
9.1.1.2.9 HasSuperBinding ( )
객체 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
객체 환경 레코드 는
super 바인딩을 제공하지 않습니다.
9.1.1.2.10 WithBaseObject ( )
객체 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 객체 또는
undefined 를
반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[IsWithEnvironment]] 가
true 라면, envRec .[[BindingObject]] 를 반환한다.
그렇지 않으면 undefined 를 반환한다.
9.1.1.3 함수 환경 레코드
함수 환경 레코드 는 선언적 환경 레코드 이며, 함수의 최상위
스코프를 표현하는 데 사용되고, 함수가 ArrowFunction 이 아닐 경우 this
바인딩을
제공합니다. 함수가 ArrowFunction 이
아니고 super를 참조한다면, 해당 함수 환경 레코드는 함수 내부에서 super 메서드 호출을 수행하는 데
사용되는
상태도 포함합니다.
함수 환경 레코드는 표
18 에 나열된 추가 상태 필드를 가집니다.
표 18: 함수 환경
레코드 의 추가 필드
필드 이름
값
의미
[[ThisValue]]
ECMAScript 언어
값
이 함수 호출에 사용되는 this 값입니다.
[[ThisBindingStatus]]
lexical , initialized ,
또는
uninitialized
값이 lexical 라면, 이는 ArrowFunction 이며 로컬
this 값을 가지지 않습니다.
[[FunctionObject]]
ECMAScript 함수 객체
이 환경 레코드 가 생성된
호출을
야기한 함수 객체 입니다.
[[NewTarget]]
생성자 또는
undefined
이 환경 레코드 가 [[Construct]] 내부 메서드에 의해 생성되었다면, [[NewTarget]] 은 [[Construct]] 의 newTarget 파라미터
값입니다.
그렇지 않으면 값은 undefined 입니다.
함수 환경 레코드는 선언적 환경 레코드 의 모든
메서드(표 16 참조)를
지원하며,
HasThisBinding과 HasSuperBinding을 제외한 모든 메서드는 동일한 명세를 따릅니다. 또한, 함수 환경 레코드는 표
19 에 나열된 메서드들도 지원합니다:
표 19: 함수 환경
레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩 값을 반환합니다. this 바인딩이 초기화되지 않았다면
ReferenceError 를 발생시킵니다.
9.1.1.3.1 BindThisValue ( envRec ,
V )
추상 연산 BindThisValue는 envRec (함수 환경 레코드 )와
V
(ECMAScript 언어 값 )를 인자로
받아,
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 envRec .[[ThisValue]] 를 세팅하고, 초기화되었음을 기록합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec .[[ThisBindingStatus]] 가
lexical 이 아님을 보장한다.
envRec .[[ThisBindingStatus]] 가
initialized 라면, ReferenceError 예외를
발생시킨다.
envRec .[[ThisValue]] 를 V 로
설정한다.
envRec .[[ThisBindingStatus]] 를
initialized 로 설정한다.
unused 를 반환한다.
9.1.1.3.2 HasThisBinding ( )
함수 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[ThisBindingStatus]] 가
lexical 이면 false 를, 아니면
true 를 반환한다.
9.1.1.3.3 HasSuperBinding ( )
함수 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[ThisBindingStatus]] 가
lexical 라면 false 를 반환한다.
envRec .[[FunctionObject]] .[[HomeObject]] 가 undefined 라면
false 를, 아니면 true 를 반환한다.
9.1.1.3.4 GetThisBinding ( )
함수 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec .[[ThisBindingStatus]] 가
lexical 이 아님을 보장한다.
envRec .[[ThisBindingStatus]] 가
uninitialized 라면 ReferenceError 예외를
발생시킨다.
envRec .[[ThisValue]] 를 반환한다.
9.1.1.3.5 GetSuperBase ( envRec )
추상 연산 GetSuperBase는 envRec (함수 환경
레코드 )를 인자로 받아 객체, null , 또는
undefined 를 반환합니다. 이 연산은 envRec 에 바인딩된
super
프로퍼티 접근의 기반이 되는 객체를 반환합니다. 값이 undefined 이면, 그러한 접근이 런타임 오류를 발생시킴을
나타냅니다. 호출 시 다음 단계를 수행합니다:
home 을 envRec .[[FunctionObject]] .[[HomeObject]] 로 둔다.
home 이 undefined 라면
undefined 를
반환한다.
Assert :
home 이 ordinary object 임을 보장한다.
! home .[[GetPrototypeOf]] ()의 결과를
반환한다.
9.1.1.4 전역 환경 레코드
전역 환경 레코드 는 공통 realm 에서 처리되는 모든
ECMAScript
Script 요소가 공유하는 가장 바깥쪽 스코프를
나타내는
데 사용됩니다. 전역 환경 레코드는 내장 글로벌(19 ), 글로벌
객체 의 프로퍼티, 그리고 Script 내에서 발생하는 모든 최상위 선언(8.2.9 ,
8.2.11 )에
대한 바인딩을 제공합니다.
전역 환경 레코드는 논리적으로 단일 레코드이지만, 객체 환경 레코드 와
선언적 환경 레코드 를 캡슐화하는
복합체로
명세되어 있습니다. 객체 환경 레코드 의 기반 객체는 관련
Realm
Record 의
글로벌
객체 입니다. 이 글로벌 객체 는 전역 환경 레코드의 GetThisBinding 구체
메서드가
반환하는 값입니다. 전역 환경 레코드의 객체 환경 레코드 구성요소에는 모든 내장
글로벌(19 )과 글로벌 코드에 포함된 FunctionDeclaration , GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration ,
또는
VariableStatement 로
도입된 바인딩이 포함됩니다. 글로벌 코드의 그 밖의 모든 ECMAScript 선언에 대한 바인딩은 전역 환경 레코드의 선언적 환경 레코드 구성 요소에
포함됩니다.
프로퍼티는 글로벌
객체 에 직접 생성될 수 있습니다. 따라서 전역 환경 레코드의 객체 환경 레코드 구성 요소에는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration ,
VariableDeclaration
선언에 의해 명시적으로 생성된 바인딩과 글로벌 객체 의 프로퍼티로 암묵적으로 생성된 바인딩이 모두 포함될 수
있습니다.
어떤 바인딩이 선언을 통해 명시적으로 생성되었는지 식별하기 위해, 전역 환경 레코드는 CreateGlobalVarBinding 및
CreateGlobalFunctionBinding
추상 연산 에 사용된
이름
목록을 유지합니다.
전역 환경 레코드는 표
20 의 추가 필드와 표
21 의
추가 메서드를 가집니다.
표 20: 전역 환경 레코드 의 추가 필드
표 21: 전역 환경 레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩 값을 반환합니다.
9.1.1.4.1 HasBinding ( N )
전역 환경 레코드
envRec 의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 인자 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다.
호출
시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
true 를 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .HasBinding (N )을
반환한다.
9.1.1.4.2 CreateMutableBinding ( N ,
D
)
전역 환경 레코드
envRec 의 CreateMutableBinding 구체 메서드는 N (문자열)과 D
(불리언)를
인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 가능한
바인딩을
생성합니다. 바인딩은 관련 DeclarativeRecord에 생성됩니다. DeclarativeRecord에 N 에 대한 바인딩이 이미
존재해서는 안 됩니다. D 가 true 이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다. 호출
시 다음
단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
TypeError 예외를 발생시킨다.
! DclRec .CreateMutableBinding(N , D )을
반환한다.
9.1.1.4.3 CreateImmutableBinding ( N ,
S )
전역 환경 레코드
envRec 의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S
(불리언)를 인자로 받아 unused를 포함하는
정상
완료 또는 throw
completion 을 반환합니다. 이름 N 에 대해 초기화되지 않은 새로운 변경 불가능한
바인딩을
생성합니다. 이 환경 레코드 내에 N 에 대한
바인딩이
이미 존재해서는 안 됩니다. S 가 true 이면, 새로 생성된 바인딩이 strict 바인딩임을
표시합니다.
호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이 true 라면
TypeError 예외를 발생시킨다.
! DclRec .CreateImmutableBinding(N , S )을
반환한다.
9.1.1.4.4 InitializeBinding ( N , V
)
전역 환경 레코드
envRec 의 InitializeBinding 구체 메서드는 N (문자열)과 V
(ECMAScript 언어 값 )를 인자로
받아
unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 설정합니다. N 에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
! DclRec .InitializeBinding(N ,
V )을
반환한다.
Assert :
바인딩이 존재한다면, 반드시 객체 환경
레코드 에 존재해야 한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .InitializeBinding (N ,
V )을 반환한다.
9.1.1.4.5 SetMutableBinding ( N ,
V ,
S )
전역 환경 레코드
envRec 의 SetMutableBinding 구체 메서드는 N (문자열), V
(ECMAScript 언어 값 ),
S (불리언)를 인자로 받아 unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 식별자의 현재 바인딩 값을
V 로 변경하려고 시도합니다. 바인딩이 변경 불가능한 경우 S 가 true 이면
TypeError 를 발생시킵니다. N 이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지
않거나 쓰기
불가능한 경우 오류 처리는 S 에 따라 결정됩니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
? DclRec .SetMutableBinding(N ,
V ,
S )을 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .SetMutableBinding (N ,
V , S )을 반환한다.
9.1.1.4.6 GetBindingValue ( N , S )
전역 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
바인딩이 초기화되지 않은 바인딩이면 ReferenceError 예외를 발생시킵니다. N 이라는
이름의
프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 결과는 S 에 따라 결정됩니다. 호출 시 다음 단계를
수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
? DclRec .GetBindingValue(N ,
S )을
반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
? ObjRec .GetBindingValue (N ,
S )을 반환한다.
9.1.1.4.7 DeleteBinding ( N )
전역 환경 레코드
envRec 의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상
완료
또는 throw
completion 을 반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다.
호출 시
다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )이
true 라면,
! DclRec .DeleteBinding(N )을 반환한다.
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
existingProp 이 true 라면,
? ObjRec .DeleteBinding (N )을
반환한다.
true 를 반환한다.
9.1.1.4.8 HasThisBinding ( )
전역 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
true 를 반환한다.
참고
전역 환경 레코드 는 항상
this 바인딩을 제공합니다.
9.1.1.4.9 HasSuperBinding ( )
전역 환경 레코드
envRec 의 HasSuperBinding 구체 메서드는 인자가 없으며 false 를 반환합니다.
호출 시
다음 단계를 수행합니다:
false 를 반환한다.
참고
전역 환경 레코드 는
super 바인딩을 제공하지 않습니다.
9.1.1.4.10 WithBaseObject ( )
전역 환경 레코드
envRec 의 WithBaseObject 구체 메서드는 인자가 없으며 undefined 를
반환합니다.
호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.4.11 GetThisBinding ( )
전역 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 객체를 포함하는 정상
완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
envRec .[[GlobalThisValue]] 를 반환한다.
9.1.1.4.12 HasLexicalDeclaration ( envRec ,
N )
추상 연산 HasLexicalDeclaration은 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아 불리언을 반환합니다. 이 연산은 인자 식별자가 LexicalDeclaration 또는 ClassDeclaration 과
같은
렉시컬 선언을 사용해 envRec 에 바인딩되어 있는지 판단합니다. 호출 시 다음 단계를 수행합니다:
DclRec 를 envRec .[[DeclarativeRecord]] 로 둔다.
! DclRec .HasBinding(N )을 반환한다.
9.1.1.4.13 HasRestrictedGlobalProperty (
envRec ,
N )
추상 연산 HasRestrictedGlobalProperty는 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 인자 식별자가 글로벌
객체 의 글로벌 렉시컬 바인딩에 의해 가려져서는 안 되는 프로퍼티 이름인지 판단합니다. 호출 시 다음 단계를
수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 이 undefined 라면
false 를 반환한다.
existingProp .[[Configurable]] 가
true 라면 false 를 반환한다.
true 를 반환한다.
참고
글로벌 객체 에 var나 function 선언을
사용하지
않고 직접 생성된 프로퍼티가 존재할 수 있습니다. 글로벌 렉시컬 바인딩은 글로벌 객체 의
non-configurable 프로퍼티와 같은 이름으로는 생성될 수 없습니다. "undefined"
글로벌
프로퍼티가 그 예입니다.
9.1.1.4.14 CanDeclareGlobalVar ( envRec ,
N )
추상 연산 CanDeclareGlobalVar는 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아, 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalVarBinding 을
호출할 경우
성공할지 판단합니다. 중복 var 선언 및 기존 글로벌 객체 프로퍼티에 대한 var 선언은 허용됩니다. 호출 시
다음
단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
hasProperty 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
hasProperty 가 true 라면 true 를
반환한다.
? IsExtensible (globalObject )를
반환한다.
9.1.1.4.15 CanDeclareGlobalFunction ( envRec ,
N )
추상 연산 CanDeclareGlobalFunction은 envRec (전역 환경 레코드 )와
N
(문자열)을 인자로 받아, 불리언을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalFunctionBinding 을
호출할 경우 성공할지 판단합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 가 undefined 라면, ? IsExtensible (globalObject )를
반환한다.
existingProp .[[Configurable]] 가
true 라면 true 를 반환한다.
IsDataDescriptor (existingProp )가
true 이고 existingProp 의 특성 값이 { [[Writable]] : true , [[Enumerable]] : true }라면
true 를 반환한다.
false 를 반환한다.
9.1.1.4.16 CreateGlobalVarBinding ( envRec ,
N , D )
추상 연산 CreateGlobalVarBinding은 envRec (전역 환경 레코드 ),
N
(문자열), D (불리언)를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 연관된 객체 환경 레코드 에 변경 가능한 바인딩을
생성
및 초기화합니다. 바인딩이 이미 존재한다면 재사용하며, 이미 초기화된 것으로 간주합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
hasProperty 를 ? HasOwnProperty (globalObject ,
N )로 둔다.
extensible 을 ? IsExtensible (globalObject )로
둔다.
hasProperty 가 false 이고 extensible 이
true 라면,
? ObjRec .CreateMutableBinding (N ,
D )을 수행한다.
? ObjRec .InitializeBinding (N ,
undefined )을 수행한다.
unused 를 반환한다.
9.1.1.4.17 CreateGlobalFunctionBinding (
envRec ,
N , V , D )
추상 연산 CreateGlobalFunctionBinding은 envRec (전역 환경 레코드 ),
N
(문자열), V (ECMAScript 언어
값 ),
D (불리언)를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 연관된 객체 환경 레코드 에 변경 가능한 바인딩을
생성
및 초기화합니다. 바인딩이 이미 존재한다면 대체합니다. 호출 시 다음 단계를 수행합니다:
ObjRec 를 envRec .[[ObjectRecord]] 로
둔다.
globalObject 를 ObjRec .[[BindingObject]] 로 둔다.
existingProp 를 ? globalObject .[[GetOwnProperty]] (N )로 둔다.
existingProp 가 undefined 이거나
existingProp .[[Configurable]] 가
true 라면,
desc 를 PropertyDescriptor { [[Value]] : V , [[Writable]] : true , [[Enumerable]] : true ,
[[Configurable]] : D }로 둔다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Value]] : V }로 둔다.
? DefinePropertyOrThrow (globalObject ,
N , desc )을 수행한다.
? Set (globalObject ,
N , V , false )을 수행한다.
unused 를 반환한다.
참고
전역 함수 선언은 항상 글로벌 객체 의 own 프로퍼티로 표현됩니다.
가능할
경우, 기존 own 프로퍼티를 표준 특성 값 집합을 가지도록 재설정합니다. 7 단계는
InitializeBinding 구체 메서드를 호출하는 것과 동등하며, globalObject 가 Proxy인 경우
동일한
Proxy trap 호출 시퀀스를 생성합니다.
9.1.1.5 모듈 환경 레코드
모듈 환경 레코드 는 선언적 환경 레코드 로,
ECMAScript
Module 의 외부 스코프를 표현하는 데
사용됩니다.
일반적인 변경 가능/불변 바인딩 외에, 모듈 환경 레코드는 다른 환경 레코드 에 존재하는 대상
바인딩에
간접적으로 접근할 수 있는 변경 불가능한 import 바인딩도 제공합니다.
모듈 환경 레코드는 선언적 환경 레코드 의 모든
메서드(표 16 참조)를
지원하며,
GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding을 제외한 모든 메서드는 동일한 명세를
따릅니다.
또한, 모듈 환경 레코드는 표
22 에 나열된 메서드들도 지원합니다:
표 22: 모듈 환경 레코드 의 추가 메서드
메서드
목적
GetThisBinding()
이 환경 레코드 의
this 바인딩의 값을 반환합니다.
9.1.1.5.1 GetBindingValue ( N , S )
모듈 환경 레코드
envRec 의 GetBindingValue 구체 메서드는 N (문자열), S (불리언)를
인자로
받아 ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 메서드는 이름이 N 인 바인딩된 식별자의 값을
반환합니다.
단, 바인딩이 간접 바인딩인 경우 대상 바인딩의 값을 반환합니다. 바인딩이 존재하지만 아직 초기화되지 않았다면
ReferenceError 가 발생합니다. 호출 시 다음 단계를 수행합니다:
Assert :
S 가 true 임을 보장한다.
Assert :
envRec 에 N 에 대한 바인딩이 존재함을 보장한다.
N 에 대한 바인딩이 간접 바인딩이라면,
이 바인딩이 생성될 때 제공된 indirection 값 M 및 N2 를 얻는다.
targetEnv 를 M .[[Environment]] 로 둔다.
targetEnv 가 empty 라면
ReferenceError 예외를 발생시킨다.
? targetEnv .GetBindingValue (N2 ,
true )를 반환한다.
envRec 내 N 에 대한 바인딩이 초기화되지 않았다면
ReferenceError 예외를 발생시킨다.
envRec 내 N 에 현재 바인딩된 값을 반환한다.
참고
S 는 항상 true 입니다. 왜냐하면 Module 은 항상 엄격 모드 코드 이기 때문입니다.
9.1.1.5.2 DeleteBinding ( N )
모듈 환경 레코드 의
DeleteBinding
구체 메서드는 이 명세 안에서 사용되지 않습니다.
참고
모듈 환경 레코드 는 엄격
코드
내에서만 사용되며, 조기 오류 규칙에 의해 엄격 코드 내에서 Reference
Record 가 모듈 환경
레코드 바인딩으로 해석되는 경우 delete 연산자를 사용할 수 없습니다. 13.5.1.1
참고.
9.1.1.5.3 HasThisBinding ( )
모듈 환경 레코드
envRec 의 HasThisBinding 구체 메서드는 인자가 없으며 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
true 를 반환한다.
참고
모듈 환경 레코드 는 항상
this 바인딩을 제공합니다.
9.1.1.5.4 GetThisBinding ( )
모듈 환경 레코드
envRec 의 GetThisBinding 구체 메서드는 인자가 없으며 undefined를 포함하는 정상
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
undefined 를 반환한다.
9.1.1.5.5 CreateImportBinding ( envRec ,
N , M , N2 )
추상 연산 CreateImportBinding은 envRec (모듈 환경 레코드 ),
N
(문자열), M (모듈 레코드 ), N2
(문자열)을
인자로 받아 unused 를 반환합니다. N 에 대해 초기화된 변경 불가능한 간접 바인딩을
새롭게
생성합니다. envRec 내에 이미 N 에 대한 바인딩이 존재해서는 안 됩니다. N2 는
M 의 모듈 환경 레코드 에 존재하는 바인딩의
이름입니다. 새 바인딩에 대한 값 접근은 간접적으로 대상 바인딩의 값을 접근합니다. 호출 시 다음 단계를 수행합니다:
Assert :
envRec 에 N 에 대한 바인딩이 이미 존재하지 않음을 보장한다.
Assert :
M .[[Environment]] 가 인스턴스화될 때
N2 에
대한 직접 바인딩을 가지게 됨을 보장한다.
envRec 에 N 에 대해 M 과 N2 를 대상 바인딩으로
참조하는
변경 불가능한 간접 바인딩을 생성하고, 이 바인딩이 초기화되었음을 기록한다.
unused 를 반환한다.
9.1.2 환경 레코드 연산
다음의 추상 연산 들은 이 명세에서
환경
레코드 에 대해 동작할 때 사용됩니다:
9.1.2.1 GetIdentifierReference ( env ,
name , strict )
추상 연산 GetIdentifierReference는 env (환경 레코드 또는
null ), name (문자열), strict (불리언)을 인자로 받아,
Reference Record를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 호출 시 다음 단계를 수행합니다:
env 가 null 이면,
Reference
Record { [[Base]] :
unresolvable , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] :
empty }를
반환한다.
exists 를 ? env .HasBinding (name )로 둔다.
exists 가 true 이면,
Reference
Record { [[Base]] :
env , [[ReferencedName]] :
name , [[Strict]] : strict ,
[[ThisValue]] :
empty }를
반환한다.
그 외의 경우,
outer 를 env .[[OuterEnv]] 로
둔다.
? GetIdentifierReference (outer ,
name , strict )를 반환한다.
9.1.2.2 NewDeclarativeEnvironment ( E )
추상 연산 NewDeclarativeEnvironment는 E (환경 레코드 또는
null )를 인자로 받아 선언적 환경
레코드 를
반환합니다. 호출 시 다음 단계를 수행합니다:
env 를 새로운 선언적 환경
레코드 (바인딩 없음)로 둔다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.1.2.3 NewObjectEnvironment ( O , W ,
E )
추상 연산 NewObjectEnvironment는 O (객체), W (불리언), E
(환경
레코드 또는 null )를 인자로 받아 객체 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
env 를 새로운 객체 환경
레코드 로 둔다.
env .[[BindingObject]] 를 O 로 설정한다.
env .[[IsWithEnvironment]] 를 W 로
설정한다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.1.2.4 NewFunctionEnvironment ( F ,
newTarget )
추상 연산 NewFunctionEnvironment는 F (ECMAScript 함수 객체 ),
newTarget
(객체 또는 undefined )를 인자로 받아 함수 환경 레코드 를 반환합니다. 호출 시
다음
단계를 수행합니다:
env 를 새로운 함수 환경
레코드 (바인딩 없음)로 둔다.
env .[[FunctionObject]] 를 F 로 설정한다.
F .[[ThisMode]] 가
lexical 이면, env .[[ThisBindingStatus]] 를 lexical 로
설정한다.
그 외의 경우, env .[[ThisBindingStatus]] 를
uninitialized 로 설정한다.
env .[[NewTarget]] 를 newTarget 로
설정한다.
env .[[OuterEnv]] 를 F .[[Environment]] 로 설정한다.
env 를 반환한다.
9.1.2.5 NewGlobalEnvironment ( G ,
thisValue )
추상 연산 NewGlobalEnvironment는 G (객체), thisValue (객체)를 인자로 받아
전역 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
objRec 를 NewObjectEnvironment (G ,
false , null )로 둔다.
dclRec 를 NewDeclarativeEnvironment (null )로
둔다.
env 를 새로운 전역 환경
레코드 로 둔다.
env .[[ObjectRecord]] 를 objRec 로
설정한다.
env .[[GlobalThisValue]] 를
thisValue 로 설정한다.
env .[[DeclarativeRecord]] 를
dclRec 로 설정한다.
env .[[OuterEnv]] 를 null 로
설정한다.
env 를 반환한다.
9.1.2.6 NewModuleEnvironment ( E )
추상 연산 NewModuleEnvironment는 E (환경 레코드 )를 인자로 받아
모듈 환경 레코드 를 반환합니다. 호출 시 다음
단계를
수행합니다:
env 를 새로운 모듈 환경
레코드 (바인딩 없음)로 둔다.
env .[[OuterEnv]] 를 E 로 설정한다.
env 를 반환한다.
9.2 PrivateEnvironment 레코드
PrivateEnvironment 레코드 는 ECMAScript 코드 내의 ClassDeclaration 및 ClassExpression 의 렉시컬 중첩 구조를 기반으로 Private
Name 을 추적하기 위해 사용되는 명세 메커니즘입니다. 이들은 환경
레코드 와 유사하지만 구분됩니다. 각
PrivateEnvironment 레코드 는 하나의 ClassDeclaration 또는 ClassExpression 에 연관됩니다. 해당 클래스가
평가될
때마다, 그 클래스에서 선언된 Private Name 을 기록하기 위해 새로운 PrivateEnvironment 레코드 가 생성됩니다.
각 PrivateEnvironment 레코드 는 표 23 에 정의된 필드를 가집니다.
표 23: PrivateEnvironment 레코드 필드
9.2.1 PrivateEnvironment 레코드 연산
다음의 추상 연산 들은 이 명세에서
PrivateEnvironment 레코드 에 대해 동작할 때
사용됩니다:
9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )
추상 연산 NewPrivateEnvironment는 outerPrivateEnv (PrivateEnvironment 레코드 또는
null )를 인자로 받아 PrivateEnvironment
레코드 를 반환합니다. 호출 시 다음 단계를 수행합니다:
names 를 새로운 빈 List 로 둔다.
PrivateEnvironment 레코드
{
[[OuterPrivateEnvironment]] :
outerPrivateEnv ,
[[Names]] : names }를 반환한다.
9.2.1.2 ResolvePrivateIdentifier ( privateEnv ,
identifier )
추상 연산 ResolvePrivateIdentifier는 privateEnv (PrivateEnvironment 레코드 ),
identifier (문자열)를 인자로 받아 Private Name 를 반환합니다. 호출 시
다음 단계를 수행합니다:
names 를 privateEnv .[[Names]] 로 둔다.
names 의 각 Private Name pn 에 대해,
pn .[[Description]] 이
identifier 라면,
pn 를 반환한다.
outerPrivateEnv 를 privateEnv .[[OuterPrivateEnvironment]] 로 둔다.
Assert :
outerPrivateEnv 는 null 이 아님을 보장한다.
ResolvePrivateIdentifier (outerPrivateEnv ,
identifier )를 반환한다.
9.3 Realm
평가되기 전에, 모든 ECMAScript 코드는 realm 에 연관되어야
합니다.
개념적으로, realm 은 일련의 내장 객체
집합,
ECMAScript 글로벌 환경, 그 글로벌 환경의 범위 내에서 로드된 모든 ECMAScript 코드, 기타 관련 상태와 리소스로 구성됩니다.
realm 은 이 명세에서 Realm Record 로 표현되며, 표
24 에 명시된 필드를 가집니다:
표 24: Realm
Record 필드
9.3.1 InitializeHostDefinedRealm ( )
추상 연산 InitializeHostDefinedRealm는 인자가 없으며, unused를 포함하는 정상 완료
또는
throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
realm 을 새로운 Realm Record 로 둔다.
CreateIntrinsics (realm )을
수행한다.
realm .[[AgentSignifier]] 를 AgentSignifier ()로 설정한다.
realm .[[TemplateMap]] 을 새로운 빈 List 로 설정한다.
newContext 를 새로운 실행 컨텍스트 로 둔다.
newContext 의 Function을 null 로 설정한다.
newContext 의 Realm 을 realm 으로 설정한다.
newContext 의 ScriptOrModule을 null 로 설정한다.
newContext 를 실행 컨텍스트 스택 에 푸시한다;
newContext 가 실행 중인 실행 컨텍스트 가 된다.
호스트 가
realm 의 글로벌 객체 로 익조틱
객체 를 사용해야 한다면,
global 을 그런 객체로, 호스트 정의 방식으로 생성한다.
그 외의 경우,
global 을 OrdinaryObjectCreate (realm .[[Intrinsics]] .[[%Object.prototype% ]])로
둔다.
호스트 가
realm 의 글로벌 스코프의 this 바인딩이 글로벌
객체 이외의 객체를 반환해야 한다면,
thisValue 를 그런 객체로, 호스트 정의 방식으로 생성한다.
그 외의 경우,
thisValue 를 global 로 둔다.
realm .[[GlobalObject]] 를 global 로 설정한다.
realm .[[GlobalEnv]] 를 NewGlobalEnvironment (global ,
thisValue )로 설정한다.
? SetDefaultGlobalBindings (realm )을
수행한다.
호스트
정의 글로벌 객체 프로퍼티들을 global 에
생성한다.
unused 를 반환한다.
9.3.2 CreateIntrinsics ( realmRec )
추상 연산 CreateIntrinsics는 realmRec (Realm Record )를 인자로 받아
unused 를
반환합니다. 호출 시 다음 단계를 수행합니다:
realmRec .[[Intrinsics]] 를 새로운 Record 로 설정한다.
realmRec .[[Intrinsics]] 의 각 필드를 표 6 에 명시된 값들로 설정한다.
필드명은 표의 첫 번째 열에 기재된 이름이다. 각 필드의 값은, 이 명세의 각 객체 명세에 따라 완전히, 재귀적으로 프로퍼티 값이 채워진 새로운 객체
값이다.
모든 객체 프로퍼티 값은 새로 생성된 객체 값이어야 한다. 내장 함수 객체 인 값은 CreateBuiltinFunction (steps ,
length , name , slots , realmRec ,
prototype )을 수행하여 생성한다. steps 는 명세에 정의된 함수 정의, name 은
함수의
"name" 프로퍼티 초기값, length 는 "length"
초기값,
slots 는 함수의 내부 슬롯명(있으면), prototype 은 함수의 [[Prototype]] 내부 슬롯의 명세 값이다. intrinsic 및 그 프로퍼티 생성 순서는 아직
생성되지
않은 객체에 의존하지 않도록 해야 한다.
AddRestrictedFunctionProperties (realmRec .[[Intrinsics]] .[[%Function.prototype% ]],
realmRec )을 수행한다.
unused 를 반환한다.
9.3.3 SetDefaultGlobalBindings ( realmRec )
추상 연산 SetDefaultGlobalBindings는 realmRec (Realm Record )를 인자로 받아 unused를 포함하는 정상 완료
또는
throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
global 을 realmRec .[[GlobalObject]] 로
둔다.
19 절에 명시된 글로벌 객체의 각 프로퍼티에 대해,
name 을 프로퍼티 이름 의 문자열 값으로 둔다.
desc 를 완전히 채워진 데이터 Property
Descriptor 로 둔다. 여기에는 프로퍼티에 대한 명시된 특성이 포함된다. 19.2 ,
19.3 ,
19.4 에
나열된 프로퍼티의 경우 [[Value]] 특성 값은 realmRec 의
해당
intrinsic 객체이다.
? DefinePropertyOrThrow (global ,
name , desc )를 수행한다.
unused 를 반환한다.
9.4 실행 컨텍스트
실행 컨텍스트 는 ECMAScript 구현체가 코드의 런타임 평가를 추적하기
위해
사용하는 명세 장치입니다. 특정 시점에, 실제로 코드를 실행 중인 agent 마다 최대 하나의 실행 컨텍스트만 존재할 수 있습니다. 이를 agent 의 실행 중인 실행
컨텍스트 라 합니다. 이 명세에서 실행 중인 실행
컨텍스트 에 대한 모든 참조는 상위 agent 의 실행 중인
실행
컨텍스트 를 나타냅니다.
실행 컨텍스트
스택 은
실행 컨텍스트들을 추적하는 데 사용됩니다. 실행 중인 실행 컨텍스트 는 항상 이 스택의 맨 위 요소입니다. 현재
실행
중인 실행 컨텍스트 와 연관된 실행 코드에서 아직 연관되지 않은 실행 코드로 제어가 이동할 때마다, 새 실행 컨텍스트가 생성되어
스택에
푸시되고 실행 중인 실행 컨텍스트 가 됩니다.
실행 컨텍스트는 연관된 코드의 실행 진행을 추적하는 데 필요한 구현체 고유의 상태를 포함합니다. 각 실행 컨텍스트는 최소한 표 25 에 나열된 상태 구성
요소를
가집니다.
표 25: 모든 실행 컨텍스트의 상태 구성 요소
Evaluation 은
실행
중인 실행 컨텍스트 에 의해 여러 정의된 지점에서 일시 중단될 수 있습니다. 일단 실행 중인
실행
컨텍스트 가 일시 중단되면, 다른 실행 컨텍스트가 실행 중인 실행 컨텍스트 가 되어 자신의 코드를
평가하기 시작할 수 있습니다. 이후 일시 중단된 실행 컨텍스트가 다시 실행 중인 실행 컨텍스트 가 되어 코드 평가를
중단된 지점부터 재개할 수
있습니다. 실행 컨텍스트들 간의 실행 중인 실행 컨텍스트 상태의 전이는 보통 스택과 같은
후입선출(LIFO)
방식으로 발생합니다. 다만, 일부 ECMAScript 기능은 실행 중인 실행 컨텍스트 의 비-LIFO 전이를 요구합니다.
실행 중인
실행 컨텍스트 의 Realm 구성 요소 값을 현재
Realm
Record 라고도 합니다. 실행 중인 실행 컨텍스트 의 Function 구성 요소는 활성 함수 객체 라고도 합니다.
ECMAScript 코드 실행 컨텍스트 는 표
26 에 나열된 추가 상태 구성 요소를 가집니다.
표 26: ECMAScript 코드 실행 컨텍스트의 추가 상태 구성 요소
실행 컨텍스트의 LexicalEnvironment, VariableEnvironment 구성 요소는 항상 환경
레코드 입니다.
Generator의 평가를 나타내는 실행 컨텍스트는 표
27 에 나열된 추가 상태 구성 요소를 가집니다.
표 27: Generator 실행 컨텍스트의 추가 상태 구성 요소
구성 요소
목적
Generator
이 실행 컨텍스트 가 평가하는
Generator.
대부분의 상황에서 이 명세 내 알고리즘이 직접 다루는 것은 실행 중인 실행 컨텍스트 (즉, 실행 컨텍스트
스택 의 맨 위)입니다. 따라서 “LexicalEnvironment”, “VariableEnvironment”라는 용어가 한정 없이
사용될
때는 실행 중인 실행 컨텍스트 의 해당 구성 요소를 의미합니다.
실행 컨텍스트는 순수 명세 메커니즘으로, ECMAScript 구현의 실제 산출물과 반드시 대응하지 않습니다. ECMAScript 코드가 실행 컨텍스트를 직접 접근하거나
관찰하는 것은
불가능합니다.
9.4.1 GetActiveScriptOrModule ( )
추상 연산 GetActiveScriptOrModule은 인자가 없으며, Script Record , Module Record 또는
null 을 반환합니다. 실행 중인 실행 컨텍스트 를 기반으로
현재 실행 중인 스크립트 또는
모듈을 결정하는 데 사용됩니다. 호출 시 다음 단계를 수행합니다:
실행 컨텍스트 스택 이 비어있으면
null 을 반환한다.
ec 를 실행 컨텍스트 스택 에서 ScriptOrModule
구성
요소가 null 이 아닌 맨 위의 실행 컨텍스트 로 둔다.
그런 실행 컨텍스트 가 존재하지 않으면
null 을 반환하고, 그렇지 않으면 ec 의 ScriptOrModule을 반환한다.
9.4.2 ResolveBinding ( name [ , env ] )
추상 연산 ResolveBinding은 name (문자열) 및 선택적 env (환경
레코드 또는 undefined )를 인자로 받아, Reference Record를 포함하는 정상
완료 또는 throw
completion 을 반환합니다. 이 연산은 name 의 바인딩을 결정하는 데 사용됩니다.
env 를 명시적으로 지정하면 해당 환경 레코드 에서 바인딩을 탐색합니다. 호출 시 다음 단계를
수행합니다:
env 가 생략되었거나 env 가 undefined 라면,
env 를 실행 중인 실행
컨텍스트 의
LexicalEnvironment로 설정한다.
Assert :
env 는 환경 레코드 임을 보장한다.
strict 를 IsStrict (현재 평가 중인 구문 생성 규칙)로 둔다.
? GetIdentifierReference (env ,
name , strict )를 반환한다.
참고
ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가
name 인
Reference
Record 입니다.
9.4.3 GetThisEnvironment ( )
추상 연산 GetThisEnvironment는 인자가 없으며 환경 레코드 를 반환합니다. 현재 키워드 this의 바인딩을
제공하는
환경
레코드 를 찾습니다. 호출 시 다음 단계를 수행합니다:
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 둔다.
반복,
exists 를 env .HasThisBinding()으로 둔다.
exists 가 true 라면 env 를 반환한다.
outer 를 env .[[OuterEnv]] 로 둔다.
Assert :
outer 가 null 이 아님을 보장한다.
env 를 outer 로 설정한다.
참고
2 단계의 루프는 환경 리스트가 항상
this 바인딩을 가진 글로벌 환경에서 끝나므로 반드시 종료됩니다.
9.4.4 ResolveThisBinding ( )
추상 연산 ResolveThisBinding은 인자가 없으며 ECMAScript 언어 값을 포함하는
정상
완료 또는 throw
completion 을 반환합니다. 실행 중인 실행 컨텍스트 의
LexicalEnvironment를 사용하여 키워드 this의 바인딩을
결정합니다. 호출 시 다음 단계를 수행합니다:
envRec 를 GetThisEnvironment ()로 둔다.
? envRec .GetThisBinding()을 반환한다.
9.4.5 GetNewTarget ( )
추상 연산 GetNewTarget은 인자가 없으며 객체 또는 undefined 를 반환합니다. 실행
중인
실행 컨텍스트 의 LexicalEnvironment를 사용해 NewTarget 값을 결정합니다. 호출 시 다음 단계를
수행합니다:
envRec 를 GetThisEnvironment ()로 둔다.
Assert :
envRec 가 [[NewTarget]] 필드를 가지고 있음을 보장한다.
envRec .[[NewTarget]] 을 반환한다.
9.4.6 GetGlobalObject ( )
추상 연산 GetGlobalObject는 인자가 없으며 객체를 반환합니다. 현재 실행 중인 실행 컨텍스트 가 사용하는
글로벌
객체 를 반환합니다. 호출 시 다음 단계를 수행합니다:
currentRealm 을 현재 Realm Record 로 둔다.
currentRealm .[[GlobalObject]] 를 반환한다.
9.5 잡과 잡을 큐에 넣는 호스트 연산
잡(Job) 은 파라미터가 없는 추상 클로저(Abstract
Closure) 로, 다른 ECMAScript 계산이 현재 진행 중이 아닐 때 ECMAScript 계산을 시작합니다.
잡 은 ECMAScript 호스트 환경 에
의해 특정
에이전트 에서 실행이 예약됩니다. 이 명세는 잡
예약을
위한 호스트 훅 인
HostEnqueueGenericJob , HostEnqueueFinalizationRegistryCleanupJob ,
HostEnqueuePromiseJob , HostEnqueueTimeoutJob 을 설명합니다. 이 명세의
호스트 훅 은 잡 예약에 추가
제약을
가하는 방식에 따라 구성되어 있습니다. 호스트 는
잡을
예약하는 추가 추상 연산 을 정의할 수 있습니다.
이러한
연산은 잡 추상
클로저 와 realm (Realm Record 또는 null )를 인자로 받습니다.
Realm
Record 가
제공되면, 이 연산들은 해당 realm 을
소유하는
에이전트 에서 미래의 어느 시점에 잡 실행을
예약합니다. realm 대신
null 이 제공되면, 잡은 ECMAScript 코드를 실행하지 않습니다. 구현은 다음 요구사항을 따라야 합니다:
참고 1
호스트
환경 은
잡 의
스케줄링을 동일하게 처리할 필요는 없습니다. 예를 들어, 웹 브라우저와 Node.js는 Promise 처리 잡을 다른 작업보다 더 높은 우선순위로 취급합니다.
앞으로의
기능에서는 그렇게 높은 우선순위로 처리되지 않는 잡이 추가될 수도 있습니다.
특정 시점에 scriptOrModule (Script Record , Module
Record 또는 null )이 다음 조건을 모두 만족하면 활성 스크립트 또는 모듈(active script or module) 입니다:
특정 시점에 실행이 다음 조건을 모두 만족하면 ECMAScript 코드 평가 준비
상태(prepared to evaluate ECMAScript code) 입니다:
참고 2
호스트
환경 은 실행 컨텍스트 스택 에 실행
컨텍스트 를 푸시함으로써 코드 평가 준비 상태로 만들 수 있습니다. 구체적인 단계는 구현
정의 입니다.
Realm 의 구체적인 선택은
호스트
환경 에 달려 있습니다. 이 초기 실행 컨텍스트 와 Realm 는 콜백 함수가 호출되기 전까지만
사용됩니다. Promise 핸들러 같은 잡
관련 콜백 함수가 호출되면, 해당 호출은 자체적으로 실행 컨텍스트 와 Realm 를 푸시합니다.
특정 종류의 잡 은 추가 준수 요구사항을 가집니다.
9.5.1 JobCallback 레코드
JobCallback 레코드 는 Record 값으로, 함수 객체 와
호스트 정의
값을
저장하는 데 사용됩니다. 잡 을 통해
호스트 가 큐에 넣는 함수 객체는 추가
호스트 정의
컨텍스트를 가질 수
있습니다. 그 상태를 전파하려면, 잡
추상
클로저 는 함수 객체를 직접 캡처하고 호출하지 말고, HostMakeJobCallback 및
HostCallJobCallback 을 사용해야 합니다.
참고
예를 들어 WHATWG HTML 명세(https://html.spec.whatwg.org/ )는 Promise
콜백의
incumbent settings object를 전파하기 위해 호스트 정의 값을 사용합니다.
JobCallback 레코드는 표 28 에 나열된 필드를 가집니다.
표 28: JobCallback 레코드 필드
필드 명
값
의미
[[Callback]]
함수 객체
잡 이
호출될 때
실행할 함수입니다.
[[HostDefined]]
임의의 값 (기본값 empty )
호스트 가
사용하는 필드입니다.
9.5.2 HostMakeJobCallback ( callback )
호스트 정의
추상 연산
HostMakeJobCallback은 callback (함수 객체 )를 인자로 받아 JobCallback 레코드 를 반환합니다.
HostMakeJobCallback의 구현은 다음을 준수해야 합니다:
HostMakeJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:
JobCallback 레코드 { [[Callback]] : callback , [[HostDefined]] : empty }를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트 는
HostMakeJobCallback의 기본 구현을 사용해야 합니다.
참고
이 연산은 콜백이 결국 예약·실행 책임이 있는 함수에 전달될 때 호출됩니다. 예를 들어
promise.then(thenAction)은
Promise.prototype.then을 호출할 때 thenAction에 대해
MakeJobCallback을
호출하며, 리액션 잡 을
스케줄링할 때가
아닙니다.
9.5.3 HostCallJobCallback ( jobCallback ,
V ,
argumentsList )
호스트 정의
추상 연산
HostCallJobCallback은 jobCallback (JobCallback 레코드 ),
V (ECMAScript 언어 값 ),
argumentsList (List of
ECMAScript 언어 값 )을 인자로 받아,
ECMAScript 언어 값을 포함하는 정상
완료 또는 throw
completion 을 반환합니다.
HostCallJobCallback의 구현은 다음을 준수해야 합니다:
Call (jobCallback .[[Callback]] , V , argumentsList )를 수행하고 그
결과를
반환해야 합니다.
참고
이 요구사항은 호스트 가 이
명세에서
정의한 함수
객체 의 [[Call]] 동작을 변경할 수 없음을 의미합니다.
HostCallJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:
Assert :
IsCallable (jobCallback .[[Callback]] )가 true 임을 보장한다.
? Call (jobCallback .[[Callback]] , V , argumentsList )를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트 는
HostCallJobCallback의 기본 구현을 사용해야 합니다.
9.5.4 HostEnqueueGenericJob ( job , realm )
호스트 정의
추상 연산
HostEnqueueGenericJob은 job (잡 추상 클로저 ),
realm (Realm
Record )를
인자로 받아 unused 를 반환합니다. job 을 realm 이 소유한 에이전트 의 realm 에 예약합니다. 이 알고리즘에서 사용하는
추상
클로저 는 우선순위나 순서 등 추가 제약 없이 예약되는 것을 의도합니다.
HostEnqueueGenericJob의 구현은 9.5 의 요구사항을 따라야 합니다.
9.5.5 HostEnqueuePromiseJob ( job , realm )
호스트 정의
추상 연산
HostEnqueuePromiseJob은 job (잡 추상 클로저 ),
realm (Realm
Record 또는
null )를 인자로 받아 unused 를 반환합니다. job 을 미래의
어느
시점에 실행하도록 예약합니다. 이 알고리즘의 추상 클로저 는 Promise 처리와 관련되거나 Promise 처리 연산과
같은
우선순위로 예약되는 것을 의도합니다.
HostEnqueuePromiseJob의 구현은 9.5 의 요구사항과 다음을 따라야 합니다:
참고
NewPromiseResolveThenableJob 이
반환하는 잡 의
realm 은 보통 then 함수 객체 에 GetFunctionRealm 을 호출한
결과입니다. NewPromiseReactionJob 이 반환하는
잡 의
realm 은
핸들러가 undefined 가 아니면 핸들러에 GetFunctionRealm 을
호출한
결과, 핸들러가 undefined 면 realm 은 null 입니다.
둘 다
GetFunctionRealm 이 비정상적으로 종료(예:
리보크된
Proxy에 호출)되면 realm 은 호출 시점의 현재 Realm Record 입니다.
realm 이
null 이면 사용자 ECMAScript 코드를 평가하지 않으며, 새로운 ECMAScript 객체(예: Error
객체)도
생성되지 않습니다. WHATWG HTML 명세(https://html.spec.whatwg.org/ )는 예를 들어
realm 을 스크립트 실행 가능 여부 점검, entry 개념 등에 사용합니다.
9.5.6 HostEnqueueTimeoutJob ( timeoutJob ,
realm , milliseconds )
호스트 정의
추상 연산
HostEnqueueTimeoutJob은 timeoutJob (잡 추상 클로저 ),
realm (Realm
Record ),
milliseconds (음이 아닌 유한 숫자)를 인자로 받아 unused 를 반환합니다.
timeoutJob 을 realm 이 소유한 에이전트 의 realm 에서 최소 milliseconds 밀리초 후에 실행되도록 예약합니다.
HostEnqueueTimeoutJob의 구현은 9.5 의 요구사항을 따라야 합니다.
9.6 에이전트
에이전트 는 ECMAScript 실행
컨텍스트 집합, 실행 컨텍스트 스택 , 실행 중인
실행
컨텍스트 , 에이전트
레코드 , 실행
스레드 로
구성됩니다. 실행
스레드 를 제외한 모든 구성 요소는 해당 에이전트 에만 독점적으로 속합니다.
에이전트 의 실행 스레드 는
다른
에이전트 와 독립적으로 해당 에이전트 의 실행
컨텍스트 에서 알고리즘 단계를 실행합니다. 단, 실행 스레드 가 여러 에이전트 에 의해 공유될 수는 있지만, 해당 스레드를 공유하는 에이전트 중 어느 것도 [[CanBlock]] 필드가 true 인 에이전트 레코드 를 가져서는 안 됩니다.
참고 1
예를 들어, 일부 웹 브라우저는 하나의 실행 스레드 를 브라우저 창의 여러 무관한 탭에서 공유하기도 합니다.
에이전트 의 실행 스레드 가
알고리즘
단계를 실행하는 동안 그 에이전트 는 해당
단계들의
상위 에이전트 입니다. 이 단계들은
상위
에이전트 를 사용해 에이전트 가 보유한 명세 수준의 실행 객체들, 즉 실행 중인
실행
컨텍스트 , 실행 컨텍스트 스택 , 에이전트 레코드 의 필드에
접근합니다.
에이전트 식별자(agent signifier) 는 에이전트 를 식별하기 위해 사용되는 전역적으로 유일한
불투명
값입니다.
표 29: 에이전트
레코드 필드
필드명
값
의미
[[LittleEndian]]
불리언
GetValueFromBuffer 및
SetValueInBuffer 알고리즘에서
isLittleEndian 파라미터가 필요할 때 계산되는 기본값입니다. 선택은 구현 정의 이며, 구현에 가장 효율적인
대안을
선택해야 합니다. 일단 값이 관찰되면 변경될 수 없습니다.
[[CanBlock]]
불리언
에이전트 가
블록할
수 있는지 여부를 결정합니다.
[[Signifier]]
에이전트
식별자
자신이 속한 에이전트 클러스터 내에서 에이전트 를 유일하게
식별합니다.
[[IsLockFree1]]
불리언
1-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[IsLockFree2]]
불리언
2-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[IsLockFree8]]
불리언
8-바이트 값 에 대한 원자적 연산이 lock-free라면
true , 아니면 false 입니다.
[[CandidateExecution]]
candidate execution
레코드
메모리 모델 참고.
[[KeptAlive]]
List
(객체
또는 심볼)
초기값은 새로운 빈 List 로,
현재
잡 이 끝날 때까지
생존해야 하는 객체/심볼 목록을 나타냅니다.
[[ModuleAsyncEvaluationCount]]
정수
초기값은 0이며, 비동기 또는 비동기 의존성이 있는 모듈의 [[AsyncEvaluationOrder]] 필드에 고유하게 증가하는 값을 할당하는 데
사용됩니다.
[[Signifier]] , [[IsLockFree1]] , [[IsLockFree2]] 의 값은 에이전트 클러스터 내의 어떤 에이전트 에라도 관찰되면 변경될 수 없습니다.
참고 2
[[IsLockFree1]] 과 [[IsLockFree2]] 의 값은
반드시
하드웨어에 의해 결정되는 것은 아니며, 구현 선택에 따라 시간 및 ECMAScript 구현별로 달라질 수 있습니다.
[[IsLockFree4]] 필드는 없습니다. 4바이트 원자 연산은 항상 lock-free입니다.
실제로, 원자 연산이 어떤 종류의 락을 사용한다면 lock-free가 아닙니다. lock-free는 wait-free와는 다릅니다. lock-free 원자
연산을
완료하는 데 필요한 머신 스텝 수에 상한이 없습니다.
크기 n 의 원자 접근이 lock-free여도, 크기 n 의 비원자 접근의 (관측된) 원자성에 대해서는 아무것도 보장하지 않습니다.
비원자
접근은 여전히 여러 번의 별도 메모리 접근으로 수행될 수 있습니다. 자세한 내용은 ReadSharedMemory 및
WriteSharedMemory 를 참고하세요.
참고 3
에이전트 는 명세 메커니즘일
뿐이며, 실제
ECMAScript 구현의 어떤 구체적 산출물과 반드시 대응하지는 않습니다.
9.6.1 AgentSignifier ( )
추상 연산 AgentSignifier는 인자가 없으며 에이전트 식별자 를 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
AR .[[Signifier]] 를 반환한다.
9.6.2 AgentCanSuspend ( )
추상 연산 AgentCanSuspend는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
AR .[[CanBlock]] 을 반환한다.
참고
일부 환경에서는 특정 에이전트 가
일시 정지(suspend)하는 것이 비합리적일 수 있습니다. 예를 들어, 웹 브라우저 환경에서는 문서의 메인 이벤트 처리 스레드는 일시 정지를 허용하지
않으면서 워커의 이벤트 처리 스레드는 허용할 수 있습니다.
9.6.3 IncrementModuleAsyncEvaluationCount ( )
추상 연산 IncrementModuleAsyncEvaluationCount는 인자가 없으며 정수 를 반환합니다. 호출 시 다음 단계를 수행합니다:
AR 을 상위 에이전트 의 에이전트
레코드 로 둔다.
count 를 AR .[[ModuleAsyncEvaluationCount]] 로
둔다.
AR .[[ModuleAsyncEvaluationCount]] 를
count
+ 1로 설정한다.
count 를 반환한다.
참고
이 값은 보류 중인 모듈들 간의 상대적인 평가 순서를 추적하는 데만 사용됩니다. 구현은 보류 중인 모듈이 없을 때 [[ModuleAsyncEvaluationCount]] 를 0으로 눈에 띄지 않게 초기화할 수 있습니다.
9.7 에이전트 클러스터
에이전트 클러스터 는 공유 메모리에서 동작하여 통신할 수 있는 에이전트 의 최대 집합입니다.
참고 1
서로 다른 에이전트 내의
프로그램들은
명세되지 않은 방법으로 메모리를 공유할 수 있습니다. 최소한, SharedArrayBuffer의 백업 메모리는 클러스터 내의 에이전트 들 간에 공유될 수 있습니다.
메시지 전달로는 통신할 수 있지만 메모리는 공유할 수 없는 에이전트 가 있을 수 있습니다. 이들은 결코 같은 에이전트 클러스터에 속하지 않습니다.
모든 에이전트 는 정확히 하나의 에이전트
클러스터에
속합니다.
참고 2
클러스터 내의 에이전트 가 항상
동시에
살아 있을 필요는 없습니다. 에이전트
A 가 또 다른 에이전트
B 를 생성한 뒤 A 가 종료되고, B 가 에이전트 C 를 생성했다고 합시다. 만약 A 가 B 와
메모리를
공유할 수 있고, B 가 C 와 메모리를 공유할 수 있다면, 세 에이전트 는 같은 클러스터에 속합니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[LittleEndian]] 필드 값이 동일해야 합니다.
참고 3
에이전트 클러스터 내의 서로 다른 에이전트 가 [[LittleEndian]] 값이
다르면,
멀티바이트 데이터의 공유 메모리 사용이 어려워집니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[IsLockFree1]] 필드 값이 동일해야 하며, [[IsLockFree2]]
필드도
마찬가지입니다.
클러스터 내의 모든 에이전트 는 각각의
에이전트 레코드 의
[[Signifier]] 값이 달라야 합니다.
임베딩(embedding)은 에이전트 의 지식이나
협조
없이 에이전트 의 진행을 중단(비활성화)하거나
재개(활성화)할 수 있습니다. 이럴 경우, 임베딩은 클러스터 내 일부 에이전트 만 활성 상태로 두고 나머지 에이전트 를 무기한 비활성화된 상태로 남겨두어서는 안 됩니다.
참고 4
이 제한의 목적은 다른 에이전트 가
비활성화되어 있는 동안 어떤 에이전트 가
교착 상태에 빠지거나 기아 상태에 빠지는 상황을 방지하기 위함입니다. 예를 들어, 문서와 독립적인 수명을 가진 HTML shared worker가, 그런 독립
문서의
dedicated worker와 메모리를 공유할 수 있도록 허용한다면, 그리고 문서와 그 dedicated worker가 dedicated worker가 락을
보유한
상태에서 비활성화된다면(예: 문서가 윈도우의 history에 푸시됨), shared worker가 그 락을 얻으려 하면 dedicated worker가 다시
활성화될
때까지(혹은 영원히) 대기하게 됩니다. 그 동안 다른 윈도우의 워커들이 shared worker에 접근하려 하면 기아 상태가 됩니다.
이 제한의 의미는 임베딩 내 같은 suspend/wake 집합에 속하지 않은 에이전트 끼리는 메모리 공유가 불가능하다는 점입니다.
임베딩은 클러스터 내 다른 에이전트 의 사전
지식이나
협조 없이 에이전트 를 종료시킬 수 있습니다.
만약
에이전트 가 자기 자신이나 클러스터 내 다른
에이전트 의 프로그래밍적 동작이 아니라 클러스터
외부의
힘에 의해 종료된다면, 임베딩은 두 가지 전략 중 하나를 선택해야 합니다: 클러스터 내 모든 에이전트 를 종료시키거나, 클러스터 내 남은 구성원이 종료 사실을 감지할 수 있도록 신뢰할 수 있는 API를
제공하고, 종료 데이터에는 종료된 에이전트 를
식별할
수 있는 충분한 정보를 포함해야 합니다.
참고 5
이런 종료의 예시로는: 별도 프로세스에서 실행되는 에이전트 를 운영 체제나 사용자가 종료시키는 경우, 임베딩 자체가 같은 프로세스 내에서
실행되는
에이전트 를 종료시키는
경우(에이전트별
자원 관리로 에이전트 가
runaway임이 감지됨) 등이 있습니다.
아래 명세 값과 그로부터 추이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속합니다.
클러스터 내 어떤 에이전트 에 의한
ECMAScript
코드 평가 이전에, 클러스터 내 모든 에이전트
레코드 의 [[CandidateExecution]] 필드는 초기 candidate
execution 으로 설정됩니다. 초기 candidate execution 은
빈
candidate
execution 으로, [[EventsRecords]] 필드는, 각 에이전트 에 대해, [[AgentSignifier]] 필드가 해당 에이전트 의 에이전트 식별자 이고, [[EventList]] 및
[[AgentSynchronizesWith]] 필드가 빈 List 인 Agent
Events
Record 를 포함하는 List 입니다.
참고 6
에이전트 클러스터 내 모든 에이전트 는
에이전트
레코드 의 [[CandidateExecution]] 필드에 있는 같은
candidate execution 을 공유합니다.
candidate execution 은 메모리
모델 에서 사용하는 명세 메커니즘입니다.
참고 7
에이전트 클러스터는 명세 메커니즘일 뿐이며, ECMAScript 구현의 어떤 실제 산출물과 반드시 대응하지는 않습니다.
9.8 전진 진행(Forward Progress)
에이전트 가 전진
진행 (forward
progress)한다는 것은 이 명세에 따라 평가 단계를 수행하는 것입니다.
에이전트 는 실행 중인
실행
컨텍스트 가 동기적으로, 그리고 무기한 외부 이벤트를 기다릴 때 블록(blocked) 상태가 됩니다. 이 의미에서
블록될 수
있는 것은 에이전트 의 에이전트 레코드 의 [[CanBlock]] 필드가 true 인 경우뿐입니다.
비차단(unblocked)
에이전트 는 블록되지 않은 에이전트입니다.
구현체는 다음을 보장해야 합니다:
참고
이와 메모리
모델 의 라이브니스 보장은 모든 seq-cst 쓰기가 결국 모든
에이전트 에서 관찰 가능해짐을
보장합니다.
9.9 WeakRef 및 FinalizationRegistry 대상의 처리 모델
9.9.1 목표
이 명세는 어떤 객체나 심볼도 가비지 컬렉션된다는 보장을 하지 않습니다. 라이브(live) 하지 않은 객체나 심볼은 오랜 시간이 지난 뒤에 해제될 수도 있고,
전혀
해제되지 않을 수도 있습니다. 이 때문에, 이 명세는 가비지 컬렉션에 의해 트리거되는 동작을 설명할 때 "may"라는 용어를 사용합니다.
WeakRef 및 FinalizationRegistry 의
의미론은
특정 시점에 발생하는 두 연산에 기반합니다:
이들 동작(ClearKeptObjects 또는 CleanupFinalizationRegistry )은
동기 ECMAScript 실행을 중단할 수 없습니다. 호스트 가 더 긴 동기 ECMAScript 실행을 조립할 수도 있으므로, 이 명세는 ClearKeptObjects 와 CleanupFinalizationRegistry
예약을
호스트
환경 에 위임합니다.
일부 ECMAScript 구현은 백그라운드에서, 또는 ECMAScript가 유휴 상태일 때 동작하는 가비지 컬렉터를 포함합니다. 호스트
환경 이
CleanupFinalizationRegistry 의
스케줄을 제어하도록 하면, finalizer 작업을 실행하기 위해 ECMAScript 실행을 재개할 수 있으므로, 보유 중인 값을 해제하고 전체 메모리 사용량을 줄일
수
있습니다.
9.9.2 라이브니스(Liveness)
어떤 객체/심볼 집합 S 에 대해 S 에 대한 가상 WeakRef-무시(hypothetical
WeakRef-oblivious) 실행이란, S 의 원소를 참조 대상으로 하는 WeakRefDeref 의 결과가 항상
undefined 를 반환하는 실행입니다.
참고 1
WeakRef-oblivious와 liveness는 두 가지 개념을 포착합니다. 첫째,
WeakRef 자체는 참조 대상을 살아
있게 만들지 않습니다. 둘째, 라이브니스의 순환(cycles)은 값이 live임을 의미하지 않습니다. 예를 들어,
v 의 라이브니스 판정이
WeakRef 참조 대상
r 의
라이브니스
판정에 의존할 때,
r 의 라이브니스는
v 의 라이브니스를 전제할 수 없습니다(순환 논증 불가).
참고 2
WeakRef-obliviousness는 순환을 고려하기 위해 개별 값이 아닌 객체/심볼의 집합에 대해 정의됩니다. 만약 개별 값에 대해 정의한다면, 순환
내의
WeakRef 참조 대상은 그 정체성이 오직 순환 내 다른
WeakRef 참조 대상을 통해서만 관찰될지라도 live로 간주될 것입니다.
참고 3
구어적으로, 어떤 객체나 심볼이 포함된 모든 집합이 live라면, 그 객체나 심볼이 live라고 말합니다.
실행 중 아무 시점에서, 객체/심볼 집합 S 가 다음 조건 중 하나를 만족하면 live 라고 간주합니다:
S 의 어떤 원소라도 어떤 에이전트 의 [[KeptAlive]]
List 에 포함되어 있다.
S 내의 어떤 값의 정체성이 관찰되는, S 에 대해 유효한 미래 가상 WeakRef-oblivious 실행이 존재한다.
참고 4
두 번째 조건은, 어떤 값의 정체성이 non-
WeakRef 수단으로 관찰될 수 있다면 live임을
포착하려는
의도입니다. 값의 정체성은 엄격 동등성 비교나, Map의 키로 사용되는 것을 관찰함으로써 관찰될 수 있습니다.
참고 5
객체나 심볼이 필드, 내부 슬롯, 프로퍼티에 존재한다는 사실만으로 해당 값이 live임을 의미하지 않습니다. 예를 들어, 해당 값이 프로그램에 다시
전달되지
않는다면 관찰될 수 없습니다.
이것은 WeakMap의 키, WeakSet의 멤버, 그리고 FinalizationRegistry
Cell 레코드의 [[WeakRefTarget]] , [[UnregisterToken]] 필드에 해당합니다.
위 정의는, WeakMap 내의 키가 live가 아니라면, 해당 값 또한 반드시 live일 필요가 없음을 의미합니다.
참고 6
라이브니스는
WeakRef 엔진이 비워서는 안 되는 최소 보장입니다.
여기
정의된 라이브니스는 판정 불능(undecidable)입니다. 실제로 엔진은 도달성(reachability) 등 보수적 근사치를 사용합니다. 구현의 재량이
큽니다.
9.9.3 실행
아무 시점에서, 객체/심볼 집합 S 가 live 가 아니라면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수
있습니다:
S 의 각 원소 value 에 대해,
ref .[[WeakRefTarget]] 가 value 인
모든
WeakRef
ref 에
대해,
ref .[[WeakRefTarget]] 를
empty 로 설정한다.
fg .[[Cells]] 에 cell 이 있고
cell .[[WeakRefTarget]] 가
value 인 모든
FinalizationRegistry
fg 및 레코드
cell 에 대해,
cell .[[WeakRefTarget]] 를
empty 로 설정한다.
선택적으로, HostEnqueueFinalizationRegistryCleanupJob (fg )을
수행한다.
map .[[WeakMapData]] 에 r 이 있고
r .[[Key]] 가 value 인 모든 WeakMap
map 및 레코드
r 에 대해,
r .[[Key]] 를
empty 로 설정한다.
r .[[Value]] 를
empty 로 설정한다.
set .[[WeakSetData]] 에 value 가
포함된
모든 WeakSet set 에 대해,
set .[[WeakSetData]] 의 값이
value 인 요소를 empty 값으로 교체한다.
참고 1
라이브니스 정의와 함께, 이 절은 구현체가 WeakRef 에 대해 적용할 수 있는 최적화를
명시합니다.
객체의 정체성을 관찰하지 않고 객체에 접근하는 것이 가능합니다. 도달하지 않는 객체의 프로퍼티에 대한 데드 변수 제거, 스칼라 치환 등 최적화가
허용됩니다. 이
경우 해당 객체를 가리키는 WeakRef 가 관찰 가능하게 비워지는 것도
허용됩니다.
반면, 객체의 정체성이 관찰 가능하고, 해당 객체가 WeakRef 의 [[WeakRefTarget]] 내부 슬롯에 있을 때, rematerialization 등 WeakRef 를 관찰 가능하게 비우는 최적화는
금지됩니다.
HostEnqueueFinalizationRegistryCleanupJob
호출은 선택적이므로, FinalizationRegistry 에
등록된 객체가 반드시 FinalizationRegistry 를
live 로 유지하는 것은 아닙니다. 구현체는 어떤 이유로든
FinalizationRegistry
콜백을 생략할 수 있습니다(예: FinalizationRegistry
자체가 dead가 되거나, 앱이 종료 중인 경우 등).
참고 2
구현체는 non-live 객체/심볼의 최대 집합에 대해 반드시 WeakRef 를 비울 필요는 없습니다.
구현체가 live 가 아닌 S 집합에 대해 WeakRef 를 비우기로 선택했다면, 이 정의는
S 의 모든 값에 대해 동시에 WeakRef 를 비워야
함을 요구합니다. 즉, 구현체가
v 를 가리키는 WeakRef 만 비우고, 나머지 WeakRef 를 그대로 두어
v 의 값을
관찰할 수 있다면, 이는 준수(conformant)하지 않습니다.
9.9.4 호스트 훅
9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob (
finalizationRegistry )
호스트
정의
추상 연산 HostEnqueueFinalizationRegistryCleanupJob은 finalizationRegistry
(FinalizationRegistry )를
인자로 받아 unused 를 반환합니다.
cleanupJob 을 finalizationRegistry 를 캡처하고, 호출 시 다음 단계를 수행하는 파라미터 없는
잡 추상
클로저 로 둔다:
cleanupResult 를 Completion (CleanupFinalizationRegistry (finalizationRegistry ))로
둔다.
cleanupResult 가 abrupt
completion 이라면, 오류 리포팅을 위한 호스트 정의 단계를 수행한다.
unused 를 반환한다.
HostEnqueueFinalizationRegistryCleanupJob의 구현은 cleanupJob 을 미래의 어느 시점에 실행하도록
예약합니다(가능하다면). 또한 9.5 의 요구사항을 따라야 합니다.
9.10 ClearKeptObjects ( )
ClearKeptObjects 추상 연산은 인자를 받지 않으며 unused 를 반환합니다. ECMAScript 구현은 동기적
ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출해야 합니다. 호출 시 다음 단계를 수행합니다:
agentRecord 를 상위 에이전트 의 에이전트 레코드 로 둔다.
agentRecord .[[KeptAlive]] 를 새로운 빈 List 로 설정한다.
unused 를 반환한다.
9.11 AddToKeptObjects ( value )
AddToKeptObjects 추상 연산은 value (객체 또는 심볼)를 인자로 받아 unused 를 반환합니다.
호출 시
다음 단계를 수행합니다:
agentRecord 를 상위 에이전트 의 에이전트 레코드 로 둔다.
agentRecord .[[KeptAlive]] 에 value 를 추가한다.
unused 를 반환한다.
참고
AddToKeptObjects 추상 연산이 대상 객체나 심볼로 호출되면, 대상은
ClearKeptObjects 가 호출될
때까지 해당 대상을 강하게 참조하는
목록에 추가됩니다.
9.12 CleanupFinalizationRegistry ( finalizationRegistry )
CleanupFinalizationRegistry 추상 연산은 finalizationRegistry (FinalizationRegistry )를 인자로
받아
unused를 포함하는 정상 완료 또는
throw completion 을 반환합니다.
호출
시 다음 단계를 수행합니다:
Assert :
finalizationRegistry 는 [[Cells]] 와 [[CleanupCallback]] 내부 슬롯을 가진다.
callback 를 finalizationRegistry .[[CleanupCallback]] 로 둔다.
finalizationRegistry .[[Cells]] 에 레코드
cell 이
있고 cell .[[WeakRefTarget]] 가
empty 인
동안, 구현체는 다음 단계를 수행할 수 있다:
그런 cell 중 아무거나 선택한다.
finalizationRegistry .[[Cells]] 에서
cell 을 제거한다.
? HostCallJobCallback (callback ,
undefined , « cell .[[HeldValue]] »)를 수행한다.
unused 를 반환한다.
9.13 CanBeHeldWeakly ( v )
CanBeHeldWeakly 추상 연산은 v (ECMAScript 언어 값 )를 인자로
받아
불리언을 반환합니다. v 가 약 참조로 사용하기에 적합할 때에만 true 를 반환합니다. 약 참조로 사용하기에 적합한 값만
WeakMap의 키, WeakSet의 요소, WeakRef 의 대상, 또는 FinalizationRegistry 의 대상 중
하나가
될 수 있습니다. 호출 시 다음 단계를 수행합니다:
v 가 객체 라면, true 를 반환한다.
v 가 심볼 이고 KeyForSymbol (v )가
undefined 라면, true 를 반환한다.
false 를 반환한다.
참고
언어 정체성(language
identity) 이 없는 언어 값은 사전 참조 없이 나타날 수 있으므로 약 참조로 사용하기에 부적합합니다.
Symbol.for 로 생성된 Symbol 값은 다른 Symbol 값과 달리
언어
정체성이 없으므로 약 참조로 사용하기에 부적합합니다. well-known 심볼 은 거의 수집되지 않지만, 그 수가
제한적이므로 다양한 구현 방식으로 관리 가능해 약 참조로 사용에 적합하다고 봅니다. 그러나 live WeakMap에 well-known 심볼에
연관된
값이 있다면, 해당 값은 거의 수집되지 않으며 구현체에 따라 메모리 리소스가 "누수"될 수 있습니다.
10 일반 객체와 익조틱 객체의 동작
10.1 일반 객체 내부 메서드와 내부 슬롯
모든 일반 객체 는
[[Prototype]] 이라는 내부 슬롯을 갖습니다.
이 내부 슬롯의 값은 null 또는 객체이며, 상속을 구현하는 데 사용됩니다. 만약 속성 P 가 일반 객체
O 에
존재하지 않고, [[Prototype]] 객체에 존재한다면, P 가 [[Prototype]] 객체의 데이터 프로퍼티 를 참조하는 경우, O 는 get 접근에 대해 상속하여
P 가 마치 O 의 프로퍼티인 것처럼 동작합니다. P 가 [[Prototype]]
객체의
쓰기 가능한 데이터
프로퍼티 를 참조하면, O 에서 P 에 set 접근 시 O 에
P 라는
새로운 데이터
프로퍼티 가
생성됩니다. P 가 [[Prototype]] 객체의 쓰기 불가능한 데이터 프로퍼티 를 참조하면,
O 에서 P 에 set 접근이 실패합니다. P 가 [[Prototype]] 객체의
접근자 프로퍼티 를
참조하면, 접근자는 O 에 대해 get/set 모두 상속됩니다.
모든 일반 객체 는
불리언
값의 [[Extensible]] 내부 슬롯을 가지며, 이는 6.1.7.3 에 명시된 확장성 관련
내부
메서드 불변식을 충족시키는 데 사용됩니다. 즉, 객체의 [[Extensible]] 내부 슬롯 값이
false 로 설정되면, 더 이상 객체에 프로퍼티를 추가하거나, [[Prototype]] 내부 슬롯을
수정하거나, [[Extensible]] 값을 다시 true 로 변경할 수 없습니다.
이후 알고리즘 설명에서, O 는 일반 객체 , P 는 프로퍼티 키 값, V 는 임의의 ECMAScript 언어 값 , Desc 는
프로퍼티 디스크립터 레코드라 가정합니다.
각 일반 객체 내부
메서드는 같은 이름의 추상 연산에 위임합니다. 만약 그러한 추상 연산이 다른 내부 메서드에 의존하면, 직접 추상 연산을 호출하는 대신 O 에서 내부 메서드를
호출합니다.
이러한 의미론은 익조틱
객체 에
대해 일반 객체
내부
메서드를 적용할 때, 오버라이드된 내부 메서드가 호출되도록 보장합니다.
10.1.1 [[GetPrototypeOf]] ( )
일반 객체
O 의 [[GetPrototypeOf]] 내부 메서드는 인자를 받지 않으며, 객체 또는
null 을 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryGetPrototypeOf (O )를
반환한다.
10.1.1.1 OrdinaryGetPrototypeOf ( O )
OrdinaryGetPrototypeOf 추상 연산은 O (객체)를 인자로 받아, 객체 또는 null 을
반환합니다. 호출
시 다음 단계를 수행합니다:
O .[[Prototype]] 을 반환한다.
10.1.2 [[SetPrototypeOf]] ( V )
일반 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 V (객체 또는
null )를 인자로 받아, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시 다음
단계를
수행합니다:
OrdinarySetPrototypeOf (O ,
V )를 반환한다.
10.1.2.1 OrdinarySetPrototypeOf ( O , V )
OrdinarySetPrototypeOf 추상 연산은 O (객체), V (객체 또는
null )를
인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
current 를 O .[[Prototype]] 으로 둔다.
SameValue (V ,
current )가 true 라면, true 를 반환한다.
extensible 을 O .[[Extensible]] 로 둔다.
extensible 이 false 라면, false 를 반환한다.
p 를 V 로 둔다.
done 을 false 로 둔다.
반복: done 이 false 인
동안,
p 가 null 이면,
done 을 true 로 설정한다.
그 외 SameValue (p ,
O )가 true 이면,
false 를 반환한다.
그 외,
p .[[GetPrototypeOf]] 가 일반
객체 내부 메서드(10.1.1 )가
아니라면, done 을 true 로 설정한다.
그 외, p 를 p .[[Prototype]] 으로
설정한다.
O .[[Prototype]] 을 V 로 설정한다.
true 를 반환한다.
참고
7 단계의 루프는 일반
객체 정의의 [[GetPrototypeOf]] , [[SetPrototypeOf]] 만을 사용하는 객체만 포함된 프로토타입 체인에 순환이 없음을 보장합니다.
10.1.3 [[IsExtensible]] ( )
일반 객체
O 의 [[IsExtensible]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시 다음
단계를
수행합니다:
OrdinaryIsExtensible (O )를
반환한다.
10.1.3.1 OrdinaryIsExtensible ( O )
OrdinaryIsExtensible 추상 연산은 O (객체)를 인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
O .[[Extensible]] 을 반환한다.
10.1.4 [[PreventExtensions]] ( )
일반 객체
O 의 [[PreventExtensions]] 내부 메서드는 인자를 받지 않으며,
true 를 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryPreventExtensions (O )를
반환한다.
10.1.4.1 OrdinaryPreventExtensions ( O )
OrdinaryPreventExtensions 추상 연산은 O (객체)를 인자로 받아 true 를 반환합니다. 호출
시
다음 단계를 수행합니다:
O .[[Extensible]] 를 false 로
설정한다.
true 를 반환한다.
10.1.5 [[GetOwnProperty]] ( P )
일반 객체
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받아,
프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를
반환합니다.
호출 시 다음 단계를 수행합니다:
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
10.1.5.1 OrdinaryGetOwnProperty ( O , P )
OrdinaryGetOwnProperty 추상 연산은 O (객체), P (프로퍼티 키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 반환합니다. 호출 시 다음 단계를 수행합니다:
O 에 키 P 를 가진 자체 프로퍼티가 없으면, undefined 를 반환한다.
D 를 필드가 없는 새 프로퍼티
디스크립터 로 둔다.
X 를 O 의 키 P 를 가진 자체 프로퍼티로 둔다.
X 가 데이터 프로퍼티 이면,
D .[[Value]] 를 X 의 [[Value]] 특성 값으로 설정한다.
D .[[Writable]] 를 X 의 [[Writable]] 특성 값으로 설정한다.
그 외,
Assert :
X 는 접근자 프로퍼티 이다.
D .[[Get]] 을 X 의 [[Get]] 특성 값으로 설정한다.
D .[[Set]] 을 X 의 [[Set]] 특성 값으로 설정한다.
D .[[Enumerable]] 을 X 의 [[Enumerable]] 특성 값으로 설정한다.
D .[[Configurable]] 을 X 의 [[Configurable]] 특성 값으로 설정한다.
D 를 반환한다.
10.1.6 [[DefineOwnProperty]] (
P , Desc )
일반 객체
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 ),
Desc (프로퍼티 디스크립터 )를 인자로 받아,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환합니다.
호출
시 다음 단계를 수행합니다:
? OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
10.1.6.1 OrdinaryDefineOwnProperty ( O , P ,
Desc )
OrdinaryDefineOwnProperty 추상 연산은 O (객체), P (프로퍼티 키 ),
Desc (프로퍼티
디스크립터 )를 인자로 받아,
불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다.
호출 시 다음 단계를 수행합니다:
current 를 ? O .[[GetOwnProperty]] (P )로 둔다.
extensible 을 ? IsExtensible (O )로 둔다.
ValidateAndApplyPropertyDescriptor (O ,
P , extensible , Desc , current )를 반환한다.
10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible ,
Desc , Current )
IsCompatiblePropertyDescriptor 추상 연산은 Extensible (불리언), Desc (프로퍼티 디스크립터 ),
Current (프로퍼티
디스크립터 또는 undefined )를 인자로 받아 불리언을 반환합니다. 호출 시 다음
단계를
수행합니다:
ValidateAndApplyPropertyDescriptor (undefined ,
"" , Extensible , Desc , Current )를
반환한다.
10.1.6.3 ValidateAndApplyPropertyDescriptor ( O ,
P , extensible , Desc , current )
추상 연산 ValidateAndApplyPropertyDescriptor는 O (객체 또는 undefined ),
P (프로퍼티
키 ), extensible (불리언), Desc (프로퍼티 디스크립터 ),
current (프로퍼티
디스크립터 또는 undefined )를 인자로 받고, 불리언을 반환한다.
Desc 가 지정된 extensibility 와 현재 프로퍼티 current 를 가진 객체의 프로퍼티로써 적용
가능하여
불변성 을 유지할 수
있을 때,
그리고 그 경우에만 true 를 반환한다.
그런 적용이 가능하고 O 가 undefined 가 아니면 프로퍼티 이름 P 에 대해 실제로
적용한다(필요하다면 생성). 호출 시 다음 단계를 수행한다:
Assert :
P 는 프로퍼티
키 이다.
current 가 undefined 라면,
extensible 가 false 라면 false 를
반환한다.
O 가 undefined 라면 true 를 반환한다.
IsAccessorDescriptor (Desc )
가 true 라면,
객체 O 에 이름이 P 인 자신의 접근자 프로퍼티 를
생성한다. 이 프로퍼티의 [[Get]] , [[Set]] , [[Enumerable]] , [[Configurable]] 속성은 Desc 에 해당 필드가
있으면
그 값으로, 없으면 기본값 으로
설정한다.
그 외의 경우,
객체 O 에 이름이 P 인 자신의 데이터 프로퍼티 를
생성한다. 이 프로퍼티의 [[Value]] , [[Writable]] , [[Enumerable]] , [[Configurable]] 속성은 Desc 에 해당 필드가
있으면
그 값으로, 없으면 기본값 으로
설정한다.
true 를 반환한다.
Assert :
current 는 모든 필드가 채워진
프로퍼티
디스크립터 이다.
Desc 가 아무 필드도 갖고 있지 않으면 true 를 반환한다.
current .[[Configurable]] 가
false 라면,
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 가
true 라면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 가
current .[[Enumerable]] 와 다르면
false 를 반환한다.
IsGenericDescriptor (Desc )
가 false 이고, IsAccessorDescriptor (Desc )
가 IsAccessorDescriptor (current )와
다르면
false 를 반환한다.
IsAccessorDescriptor (current )
가 true 라면,
Desc 에 [[Get]] 필드가 있고 SameValue (Desc .[[Get]] , current .[[Get]] )가 false 라면
false 를 반환한다.
Desc 에 [[Set]] 필드가 있고 SameValue (Desc .[[Set]] , current .[[Set]] )가 false 라면
false 를 반환한다.
그 외에 current .[[Writable]] 가
false 라면,
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 가
true 라면 false 를 반환한다.
참고: SameValue 는
NaN 값에 대해 true 를 반환하지만, 다른
방식으로는
구분될 수 있다. 여기서 반환하는 것은 객체 O 의 기존 프로퍼티가 변경되지 않음을 보장한다.
Desc 에 [[Value]] 필드가 있으면,
SameValue (Desc .[[Value]] , current .[[Value]] )를 반환한다.
O 가 undefined 가 아니면,
IsDataDescriptor (current )
가 true 이고 IsAccessorDescriptor (Desc )
가 true 라면,
Desc 에 [[Configurable]] 필드가 있으면
configurable 을 Desc .[[Configurable]] 로, 없으면
current .[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면
enumerable 을 Desc .[[Enumerable]] 로, 없으면 current .[[Enumerable]] 로 둔다.
객체 O 의 이름이 P 인 프로퍼티를 접근자 프로퍼티 로 교체한다. [[Configurable]] 및 [[Enumerable]] 속성은 각각
configurable 과
enumerable 로, [[Get]] 및 [[Set]] 속성은 Desc 에 해당 필드가 있으면 그 값,
없으면
기본값 으로
설정한다.
그 외에 IsAccessorDescriptor (current )
가 true 이고 IsDataDescriptor (Desc )
가 true 라면,
Desc 에 [[Configurable]] 필드가 있으면
configurable 을 Desc .[[Configurable]] 로, 없으면
current .[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면
enumerable 을 Desc .[[Enumerable]] 로, 없으면 current .[[Enumerable]] 로 둔다.
객체 O 의 이름이 P 인 프로퍼티를 데이터 프로퍼티 로 교체한다. [[Configurable]] 및 [[Enumerable]] 속성은 각각
configurable 과
enumerable 로, [[Value]] 및 [[Writable]] 속성은 Desc 에 해당 필드가 있으면
그
값, 없으면 기본값 으로
설정한다.
그 외의 경우,
Desc 의 각 필드에 대해, 객체 O 의 이름이 P 인 프로퍼티의
해당
속성을 그 값으로 설정한다.
true 를 반환한다.
10.1.7 [[HasProperty]] ( P )
일반 객체
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받아,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryHasProperty (O ,
P )를 반환한다.
10.1.7.1 OrdinaryHasProperty ( O , P )
OrdinaryHasProperty 추상 연산은 O (객체)와 P (프로퍼티 키 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
hasOwn 을 ? O .[[GetOwnProperty]] (P )로 둔다.
hasOwn 이 undefined 가 아니면 true 를 반환한다.
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이 아니면,
? parent .[[HasProperty]] (P )를 반환한다.
false 를 반환한다.
10.1.8 [[Get]] ( P ,
Receiver )
일반 객체
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryGet (O , P ,
Receiver )를 반환한다.
10.1.8.1 OrdinaryGet ( O , P ,
Receiver )
OrdinaryGet 추상 연산은 O (객체), P (프로퍼티 키 ), Receiver
(ECMAScript 언어 값 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
desc 가 undefined 이면,
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이면 undefined 를
반환한다.
? parent .[[Get]] (P ,
Receiver )를 반환한다.
IsDataDescriptor (desc )
가 true 이면 desc .[[Value]] 를
반환한다.
Assert :
IsAccessorDescriptor (desc )
가 true 이다.
getter 를 desc .[[Get]] 로 둔다.
getter 가 undefined 이면 undefined 를
반환한다.
? Call (getter ,
Receiver )를 반환한다.
10.1.9 [[Set]] ( P ,
V , Receiver )
일반 객체
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver
(ECMAScript 언어 값 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinarySet (O , P ,
V , Receiver )를 반환한다.
10.1.9.1 OrdinarySet ( O , P , V ,
Receiver )
OrdinarySet 추상 연산은 O (객체), P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, 불리언을
포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
ownDesc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
? OrdinarySetWithOwnDescriptor (O ,
P , V , Receiver , ownDesc )를 반환한다.
10.1.9.2 OrdinarySetWithOwnDescriptor ( O ,
P , V , Receiver , ownDesc )
OrdinarySetWithOwnDescriptor 추상 연산은 O (객체), P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 ),
ownDesc (프로퍼티
디스크립터 또는 undefined )를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
ownDesc 가 undefined 라면,
parent 를 ? O .[[GetPrototypeOf]] ()로 둔다.
parent 가 null 이 아니면,
? parent .[[Set]] (P ,
V , Receiver )를 반환한다.
그 외의 경우,
ownDesc 를 PropertyDescriptor { [[Value]] : undefined ,
[[Writable]] : true , [[Enumerable]] : true ,
[[Configurable]] :
true }로 설정한다.
IsDataDescriptor (ownDesc )
가 true 라면,
ownDesc .[[Writable]] 가
false 이면 false 를 반환한다.
Receiver 가 객체가 아니면
false 를
반환한다.
existingDescriptor 를 ? Receiver .[[GetOwnProperty]] (P )로 둔다.
existingDescriptor 가 undefined 가 아니면,
IsAccessorDescriptor (existingDescriptor )
가 true 이면 false 를 반환한다.
existingDescriptor .[[Writable]] 가
false 이면 false 를 반환한다.
valueDesc 를 PropertyDescriptor { [[Value]] : V }로 둔다.
? Receiver .[[DefineOwnProperty]] (P ,
valueDesc )를 반환한다.
그 외의 경우,
Assert : Receiver
에는 현재 P 프로퍼티가 없다.
? CreateDataProperty (Receiver ,
P , V )를 반환한다.
Assert :
IsAccessorDescriptor (ownDesc )
가 true 이다.
setter 를 ownDesc .[[Set]] 로 둔다.
setter 가 undefined 이면 false 를 반환한다.
? Call (setter ,
Receiver , « V »)를 수행한다.
true 를 반환한다.
10.1.10 [[Delete]] ( P )
일반 객체
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로 받고,
불리언을
포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
? OrdinaryDelete (O , P )를
반환한다.
10.1.10.1 OrdinaryDelete ( O , P )
OrdinaryDelete 추상 연산은 O (객체)와 P (프로퍼티 키 )를 인자로 받아, 불리언을 포함하는
정상 완료 또는 throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
desc 를 ? O .[[GetOwnProperty]] (P )로 둔다.
desc 가 undefined 이면 true 를 반환한다.
desc .[[Configurable]] 가
true 이면,
O 에서 이름이 P 인 자신의 프로퍼티를 제거한다.
true 를 반환한다.
false 를 반환한다.
10.1.11 [[OwnPropertyKeys]] ( )
일반 객체
O 의 [[OwnPropertyKeys]] 내부 메서드는 인자를 받지 않으며, 프로퍼티 키의 리스트 를 포함하는
정상 완료 를 반환한다. 호출 시 다음 단계를
수행한다:
OrdinaryOwnPropertyKeys (O )를
반환한다.
10.1.11.1 OrdinaryOwnPropertyKeys ( O )
OrdinaryOwnPropertyKeys 추상 연산은 O (객체)를 인자로 받아, 프로퍼티 키 의 리스트 를 반환한다. 호출 시 다음 단계를
수행한다:
keys 를 새로운 빈 List 로 둔다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
배열
인덱스 인 경우, 숫자 인덱스 오름차순으로,
P 를 keys 에 추가한다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
문자열 이고
배열
인덱스 가 아닌
경우, 프로퍼티 생성 시점 오름차순으로,
P 를 keys 에 추가한다.
O 의 각 자신의 프로퍼티 키 P 중, P 가
심볼 인 경우,
프로퍼티 생성
시점 오름차순으로,
P 를 keys 에 추가한다.
keys 를 반환한다.
10.1.12 OrdinaryObjectCreate ( proto [ ,
additionalInternalSlotsList ] )
OrdinaryObjectCreate 추상 연산은 proto (객체 또는 null ), 선택적
additionalInternalSlotsList (내부 슬롯 이름의
리스트 )를
인자로 받아 객체를 반환한다. 이는 새로운 일반 객체 의 런타임 생성을 명세하는 데 사용된다.
additionalInternalSlotsList 에는 [[Prototype]] , [[Extensible]] 외에 객체의 일부로 정의되어야 하는 추가 내부 슬롯의 이름이 포함된다.
additionalInternalSlotsList 가 생략되면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
internalSlotsList 를 « [[Prototype]] , [[Extensible]] »로 둔다.
additionalInternalSlotsList 가 있으면, internalSlotsList 를 리스트
연결 결과(internalSlotsList +
additionalInternalSlotsList )로 설정한다.
O 를 MakeBasicObject (internalSlotsList )로
둔다.
O .[[Prototype]] 을 proto 로 설정한다.
O 를 반환한다.
참고
OrdinaryObjectCreate는 MakeBasicObject 만 호출하는 것처럼 보이지만, 이 연산을
사용하는 것은 일반
객체 (exotic이 아님)를 생성하려는 의도를 명확히 전달합니다. 따라서, 이 명세 내에서
OrdinaryObjectCreate를 호출한 후 그 객체의 내부 메서드를 변경해서 exotic으로 만드는 알고리즘은 없습니다. exotic
객체 를
생성하는 연산은 직접 MakeBasicObject 를 호출합니다.
10.1.13 OrdinaryCreateFromConstructor ( constructor ,
intrinsicDefaultProto [ , internalSlotsList ] )
OrdinaryCreateFromConstructor 추상 연산은 constructor (함수 객체 ),
intrinsicDefaultProto (문자열), 선택적 internalSlotsList (내부 슬롯 이름의 리스트 )를 인자로 받아,
객체를
포함하는 정상 완료 또는 throw completion 을 반환한다.
이는
[[Prototype]] 값을 constructor 의 "prototype" 프로퍼티에서
가져오고,
없으면 intrinsicDefaultProto 로 지정된 intrinsic을 사용하는 일반 객체 를 생성한다.
internalSlotsList 에는 객체의 일부로 정의해야 하는 추가 내부 슬롯의 이름이 들어있다. internalSlotsList 가
생략되면, 새로운 빈 List 가 사용된다. 호출 시 다음 단계를
수행한다:
Assert :
intrinsicDefaultProto 는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
proto 를 ? GetPrototypeFromConstructor (constructor ,
intrinsicDefaultProto )로 둔다.
internalSlotsList 가 있으면 slotsList 를 internalSlotsList 로
둔다.
그 외에는 slotsList 를 새로운 빈 List 로
둔다.
OrdinaryObjectCreate (proto ,
slotsList )를 반환한다.
10.1.14 GetPrototypeFromConstructor ( constructor ,
intrinsicDefaultProto )
GetPrototypeFromConstructor 추상 연산은 constructor (함수 객체 ),
intrinsicDefaultProto (문자열)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
이는
특정 constructor 에
대해 객체를 만들 때 사용할 [[Prototype]] 값을 결정한다. 값은 constructor 의
"prototype"
프로퍼티에서 가져오고, 없으면 intrinsicDefaultProto 로 지정된 intrinsic이 사용된다. 호출 시 다음 단계를 수행한다:
Assert :
intrinsicDefaultProto 는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
proto 를 ? Get (constructor ,
"prototype" )로 둔다.
proto 가 객체가 아니면 ,
realm 을 ? GetFunctionRealm (constructor )로
둔다.
proto 를 realm 의 intrinsicDefaultProto 이름의
intrinsic
객체로 설정한다.
proto 를 반환한다.
참고
constructor 가 [[Prototype]] 값을 제공하지 않으면, 사용되는 기본값은
realm 에서 가져오며,
실행 중인 실행 컨텍스트 에서 가져오지 않는다.
10.1.15 RequireInternalSlot ( O , internalSlot
)
RequireInternalSlot 추상 연산은 O (ECMAScript 언어 값 ),
internalSlot (내부 슬롯 이름)을 인자로 받아, unused 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
O 가 객체 가 아니거나 해당 내부 슬롯이 없으면 예외를 던진다. 호출 시 다음 단계를 수행한다:
O 가 객체가 아니면 TypeError 예외를
던진다.
O 에 internalSlot 내부 슬롯이 없으면 TypeError 예외를 던진다.
unused 를 반환한다.
10.2 ECMAScript 함수 객체
ECMAScript 함수
객체 는 렉시컬 환경을 닫아 매개변수를 가진 ECMAScript 코드를 캡슐화하고, 그 코드의 동적 평가를 지원합니다. ECMAScript
함수 객체 는
일반 객체 이며,
다른
일반 객체 와
동일한 내부
슬롯과 내부 메서드를 가집니다. ECMAScript 함수 객체 의 코드는 엄격 모드 코드 (11.2.2 ) 또는
비엄격 코드 일 수
있습니다. ECMAScript 함수
객체 중 그 코드가 엄격 모드 코드 인 것을 엄격 함수 라 합니다. 코드가 엄격 모드
코드 가
아닌 것은 비엄격 함수 라 합니다.
[[Extensible]] 와 [[Prototype]] 외에, ECMAScript
함수 객체 는
표 30 에 나열된 내부 슬롯도
가집니다.
표 30: ECMAScript 함수 객체의 내부 슬롯
내부 슬롯
타입
설명
[[Environment]]
환경 레코드
함수가 닫힌 환경 레코드 . 함수 코드 평가 시 외부
환경으로
사용됩니다.
[[PrivateEnvironment]]
PrivateEnvironment 레코드
또는
null
함수가 닫힌 PrivateEnvironment 레코드 .
이
함수가 클래스 내부에 있지 않으면 null 입니다. 내부 클래스 코드 평가 시 외부
PrivateEnvironment로
사용됩니다.
[[FormalParameters]]
파스 노드
함수의 형식적 매개변수 목록을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ECMAScriptCode]]
파스 노드
함수 본문을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ConstructorKind]]
base 또는 derived
함수가 파생 클래스 생성자 인지 여부입니다.
[[Realm]]
Realm
Record
함수가 생성된 realm 이며, 함수 평가 시 접근되는 intrinsic 객체를 제공합니다.
[[ScriptOrModule]]
Script
Record 또는 Module
Record
함수가 생성된 스크립트 또는 모듈입니다.
[[ThisMode]]
lexical , strict , 또는
global
함수의 형식 매개변수 및 코드 본문 내에서 this 참조가 해석되는 방식을 정의합니다.
lexical 은 this가 렉시컬 상위 함수의
this 값을 참조함을 의미합니다. strict 는 함수 호출 시
제공된
this 값을 그대로 사용함을 의미합니다. global 은
this 값이 undefined 또는
null 이면
글로벌
객체 로 해석하고, 그 외의 값은 ToObject 를 거쳐 객체로
변환합니다.
[[Strict]]
불리언
true 면 엄격 함수 , false 면
비엄격 함수 입니다.
[[HomeObject]]
객체
함수가 super를 사용할 경우, super 프로퍼티 탐색이 시작되는 객체의 [[GetPrototypeOf]] 를 제공합니다.
[[SourceText]]
유니코드 코드 포인트의 시퀀스
함수를 정의하는 소스 텍스트 입니다.
[[Fields]]
레코드 리스트
(ClassFieldDefinition
레코드 )
함수가 클래스일 경우, 클래스의 비정적 필드 및 해당 이니셜라이저를 나타내는 레코드
리스트입니다.
[[PrivateMethods]]
레코드 리스트
(PrivateElement )
함수가 클래스일 경우, 클래스의 비정적 private 메서드 및 접근자를 나타내는 리스트입니다.
[[ClassFieldInitializerName]]
문자열, 심볼, Private Name , 또는
empty
함수가 클래스 필드의 이니셜라이저로 생성된 경우, 필드의 NamedEvaluation 에
사용할 이름입니다. 그렇지 않으면 empty 입니다.
[[IsClassConstructor]]
불리언
함수가 클래스 생성자 인지 나타냅니다.
(true 이면
함수의 [[Call]] 을 호출하는 즉시 TypeError 예외가
발생합니다.)
모든 ECMAScript 함수
객체 는 여기에 정의된 [[Call]] 내부 메서드를 가집니다. 생성자 이기도 한 ECMAScript 함수는
[[Construct]] 내부 메서드도 추가로 가집니다.
10.2.1 [[Call]] ( thisArgument ,
argumentsList )
ECMAScript 함수
객체 F 의 [[Call]] 내부 메서드는
thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
calleeContext 를 PrepareForOrdinaryCall (F ,
undefined )로 둔다.
Assert :
calleeContext 가 이제 실행 중인 실행 컨텍스트 임을
보장한다.
F .[[IsClassConstructor]] 가
true 이면,
error 를 새로 생성된 TypeError 객체로 둔다.
참고: error 는 calleeContext 내에서 F 와 연관된 Realm
Record 에서 생성된다.
calleeContext 를 실행 컨텍스트
스택 에서
제거하고, callerContext 를 실행 중인 실행
컨텍스트 로 복원한다.
ThrowCompletion (error )를
반환한다.
OrdinaryCallBindThis (F ,
calleeContext , thisArgument )를 수행한다.
result 를 Completion (OrdinaryCallEvaluateBody (F ,
argumentsList ))로 둔다.
calleeContext 를 실행
컨텍스트 스택 에서 제거하고, callerContext 를 실행
중인 실행 컨텍스트 로 복원한다.
result 가 return
completion 이면 result .[[Value]] 를
반환한다.
Assert :
result 가 throw
completion 임을 보장한다.
? result 를 반환한다.
참고
실행 컨텍스트 스택 에서
calleeContext 가 7 단계에서 제거될 때, accessible
Generator에 의해 나중에 재개(resume)될 수 있도록 일시 정지(suspend) 상태라면 파괴되어서는 안 됩니다.
10.2.1.1 PrepareForOrdinaryCall ( F ,
newTarget )
추상 연산 PrepareForOrdinaryCall은 F (ECMAScript 함수 객체 ), newTarget
(객체 또는
undefined )를 인자로 받아 실행 컨텍스트 를 반환한다. 호출 시 다음
단계를 수행한다:
callerContext 를 실행 중인 실행
컨텍스트 로 둔다.
calleeContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 둔다.
calleeContext 의 Function을 F 로 설정한다.
calleeRealm 을 F .[[Realm]] 으로 둔다.
calleeContext 의 Realm 을 calleeRealm 으로 설정한다.
calleeContext 의 ScriptOrModule을 F .[[ScriptOrModule]] 로 설정한다.
localEnv 를 NewFunctionEnvironment (F ,
newTarget )로 둔다.
calleeContext 의 LexicalEnvironment를 localEnv 로 설정한다.
calleeContext 의 VariableEnvironment를 localEnv 로 설정한다.
calleeContext 의 PrivateEnvironment를 F .[[PrivateEnvironment]] 로 설정한다.
callerContext 가 이미 일시 정지(suspended) 상태가 아니면, callerContext 를 일시
정지시킨다.
calleeContext 를 실행 컨텍스트 스택 에
푸시한다;
calleeContext 는 이제 실행 중인 실행
컨텍스트 이다.
참고: 이 시점 이후 생성된 모든 예외 객체는 calleeRealm 과 연관된다.
calleeContext 를 반환한다.
10.2.1.2 OrdinaryCallBindThis ( F ,
calleeContext , thisArgument )
추상 연산 OrdinaryCallBindThis는 F (ECMAScript 함수 객체 ),
calleeContext
(실행
컨텍스트 ), thisArgument (ECMAScript 언어 값 )을 인자로 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
thisMode 를 F .[[ThisMode]] 로 둔다.
thisMode 가 lexical 이면 unused 를
반환한다.
calleeRealm 을 F .[[Realm]] 으로 둔다.
localEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
thisMode 가 strict 이면,
thisValue 를 thisArgument 로 둔다.
그 외의 경우,
thisArgument 가 undefined 나
null 이면,
globalEnv 를 calleeRealm .[[GlobalEnv]] 로 둔다.
Assert : globalEnv 는
Global Environment
Record 이다.
thisValue 를 globalEnv .[[GlobalThisValue]] 로 둔다.
그 외에는,
thisValue 를 ! ToObject (thisArgument )로
둔다.
참고: ToObject 는
calleeRealm 을 사용해 래퍼 객체를 생성한다.
Assert :
localEnv 는 Function Environment
Record 이다.
Assert : 다음
단계는
localEnv .[[ThisBindingStatus]] 가
initialized 가 아니므로 abrupt
completion 을 반환하지 않는다.
! BindThisValue (localEnv ,
thisValue )를 수행한다.
unused 를 반환한다.
10.2.1.3 Runtime Semantics: EvaluateBody
구문 지시
연산(syntax-directed
operation) EvaluateBody는 functionObject (ECMAScript
함수
객체 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아 return
completion 또는 throw
completion 을 반환한다. 아래 프로덕션별로 정의된다:
FunctionBody :
FunctionStatementList
? EvaluateFunctionBody of FunctionBody with
arguments functionObject and argumentsList 를 반환한다.
ConciseBody :
ExpressionBody
? EvaluateConciseBody of ConciseBody with
arguments functionObject and argumentsList 를 반환한다.
GeneratorBody :
FunctionBody
? EvaluateGeneratorBody of GeneratorBody with
arguments functionObject and argumentsList 를 반환한다.
AsyncGeneratorBody
: FunctionBody
? EvaluateAsyncGeneratorBody of AsyncGeneratorBody
with
arguments functionObject and argumentsList 를 반환한다.
AsyncFunctionBody
: FunctionBody
? EvaluateAsyncFunctionBody of AsyncFunctionBody
with arguments functionObject and argumentsList 를 반환한다.
AsyncConciseBody
: ExpressionBody
? EvaluateAsyncConciseBody of AsyncConciseBody
with arguments functionObject and argumentsList 를 반환한다.
Initializer :
=
AssignmentExpression
Assert :
argumentsList 는 비어 있다.
Assert :
functionObject .[[ClassFieldInitializerName]] 이
empty 가 아니다.
IsAnonymousFunctionDefinition (AssignmentExpression )가
true 라면,
value 를 ? NamedEvaluation of Initializer
with argument functionObject .[[ClassFieldInitializerName]] 로 둔다.
그 외에는,
rhs 를 ? Evaluation
of AssignmentExpression 로
둔다.
value 를 ? GetValue (rhs )로 둔다.
ReturnCompletion (value )를
반환한다.
참고
필드 이니셜라이저(Field initializer)는 함수 경계로 간주되지만, FunctionDeclarationInstantiation
호출은 관찰 가능한 효과가 없으므로 생략된다.
ClassStaticBlockBody
: ClassStaticBlockStatementList
Assert :
argumentsList 는 비어 있다.
? EvaluateClassStaticBlockBody of ClassStaticBlockBody with
argument functionObject 를 반환한다.
10.2.1.4 OrdinaryCallEvaluateBody ( F ,
argumentsList )
OrdinaryCallEvaluateBody 추상 연산은 F (ECMAScript 함수 객체 )와
argumentsList
(ECMAScript 언어 값의 리스트 )를
인자로
받아, return completion 또는
throw completion 을
반환한다.
호출 시 다음 단계를 수행한다:
? EvaluateBody of F .[[ECMAScriptCode]] with arguments F 및
argumentsList 를 반환한다.
10.2.2 [[Construct]] (
argumentsList , newTarget )
ECMAScript 함수
객체 F 의 [[Construct]] 내부 메서드는
argumentsList (ECMAScript 언어 값의
리스트 )와
newTarget (생성자 )를 인자로 받고, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시
다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
kind 를 F .[[ConstructorKind]] 로 둔다.
kind 가 base 이면,
thisArgument 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%Object.prototype%" )로 둔다.
calleeContext 를 PrepareForOrdinaryCall (F ,
newTarget )로 둔다.
Assert :
calleeContext 가 현재 실행 중인 실행 컨텍스트 임을
보장한다.
kind 가 base 이면,
OrdinaryCallBindThis (F ,
calleeContext , thisArgument )를 수행한다.
initializeResult 를 Completion (InitializeInstanceElements (thisArgument ,
F ))로 둔다.
initializeResult 가 abrupt
completion 이면,
calleeContext 를 실행 컨텍스트
스택 에서 제거하고, callerContext 를 실행 중인 실행 컨텍스트 로
복원한다.
? initializeResult 를 반환한다.
constructorEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
result 를 Completion (OrdinaryCallEvaluateBody (F ,
argumentsList ))로 둔다.
calleeContext 를 실행 컨텍스트 스택 에서 제거하고,
callerContext 를 실행 중인 실행 컨텍스트 로 복원한다.
result 가 throw
completion 이면,
? result 를 반환한다.
Assert :
result 가 return
completion 임을 보장한다.
result .[[Value]] 가 객체이면 ,
result .[[Value]] 를 반환한다.
kind 가 base 이면 thisArgument 를 반환한다.
result .[[Value]] 가 undefined 가 아니면
TypeError 예외를 던진다.
thisBinding 을 ? constructorEnv .GetThisBinding()으로 둔다.
Assert :
thisBinding 이 객체임 을 보장한다.
thisBinding 을 반환한다.
10.2.3 OrdinaryFunctionCreate ( functionPrototype ,
sourceText , ParameterList , Body , thisMode ,
env , privateEnv )
OrdinaryFunctionCreate 추상 연산은 functionPrototype (객체), sourceText (유니코드 코드
포인트
시퀀스), ParameterList (파스 노드 ), Body (파스
노드 ), thisMode (lexical-this 또는
non-lexical-this ), env (환경
레코드 ), privateEnv
(PrivateEnvironment 레코드 또는
null )를 인자로 받아, ECMAScript 함수 객체 를 반환한다. 이 연산은 기본 [[Call]] 내부 메서드를 가지며 [[Construct]] 내부 메서드는
없는(단,
MakeConstructor 와 같은 연산으로 추가될 수 있음) 새 함수를 런타임에
생성하는 데 사용된다. sourceText 는 생성할 함수의 문법 정의 소스 텍스트이다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 표 30 에
나열된
내부 슬롯으로 둔다.
F 를 OrdinaryObjectCreate (functionPrototype ,
internalSlotsList )로 둔다.
F .[[Call]] 을 10.2.1 에서
정의된 것으로 설정한다.
F .[[SourceText]] 를 sourceText 로 설정한다.
F .[[FormalParameters]] 를 ParameterList 로
설정한다.
F .[[ECMAScriptCode]] 를 Body 로 설정한다.
Strict 를 IsStrict (Body )로 둔다.
F .[[Strict]] 를 Strict 로 설정한다.
thisMode 가 lexical-this 이면 F .[[ThisMode]] 를 lexical 로 설정한다.
그 외에 Strict 가 true 이면 F .[[ThisMode]] 를 strict 로 설정한다.
그 외에는 F .[[ThisMode]] 를 global 로
설정한다.
F .[[IsClassConstructor]] 를 false 로
설정한다.
F .[[Environment]] 를 env 로 설정한다.
F .[[PrivateEnvironment]] 를 privateEnv 로
설정한다.
F .[[ScriptOrModule]] 를 GetActiveScriptOrModule ()로
설정한다.
F .[[Realm]] 을 현재 Realm Record 로 설정한다.
F .[[HomeObject]] 를 undefined 로
설정한다.
F .[[Fields]] 를 새로운 빈 List 로 설정한다.
F .[[PrivateMethods]] 를 새로운 빈 List 로 설정한다.
F .[[ClassFieldInitializerName]] 을
empty 로 설정한다.
len 을 ExpectedArgumentCount
of ParameterList 로 둔다.
SetFunctionLength (F ,
len )을 수행한다.
F 를 반환한다.
10.2.4 AddRestrictedFunctionProperties ( F ,
realm )
AddRestrictedFunctionProperties 추상 연산은 F (함수 객체 )와 realm (Realm Record )를
인자로 받아 unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
realm .[[Intrinsics]] .[[%ThrowTypeError% ]]가 존재하며 초기화되어 있어야
한다.
thrower 를 realm .[[Intrinsics]] .[[%ThrowTypeError% ]]로 둔다.
! DefinePropertyOrThrow (F ,
"caller" , PropertyDescriptor { [[Get]] :
thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (F ,
"arguments" , PropertyDescriptor { [[Get]] :
thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
unused 를 반환한다.
10.2.4.1 %ThrowTypeError% ( )
이 함수는 %ThrowTypeError% intrinsic 객체이다.
이것은 각 realm 마다 하나씩 정의되는
익명 내장 함수
객체 이다.
호출 시 다음 단계를 수행한다:
TypeError 예외를 던진다.
이 함수의 [[Extensible]] 내부 슬롯의 값은 false 이다.
이 함수의 "length" 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
이 함수의 "name" 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
10.2.5 MakeConstructor ( F [ ,
writablePrototype [ , prototype ] ] )
추상 연산 MakeConstructor는 F (ECMAScript 함수 객체 또는 내장 함수 객체 ), 선택적
writablePrototype (불리언), prototype (객체)을 인자로 받아
unused 를 반환한다. 이 연산은 F 를 생성자 로 변환한다. 호출 시 다음 단계를 수행한다:
F 가 ECMAScript 함수 객체 라면,
Assert :
IsConstructor (F )가
false 임을 보장한다.
Assert :
F 는 확장 가능한 객체이며 "prototype" 자신의 프로퍼티를 갖지 않는다.
F .[[Construct]] 를 10.2.2 에서
정의된 것으로 설정한다.
그 외의 경우,
F .[[Construct]] 를 10.3.2 에서
정의된 것으로 설정한다.
F .[[ConstructorKind]] 를 base 로
설정한다.
writablePrototype 이 생략되었으면 writablePrototype 을
true 로 설정한다.
prototype 이 생략되었으면,
prototype 을 OrdinaryObjectCreate (%Object.prototype% )로
설정한다.
! DefinePropertyOrThrow (prototype ,
"constructor" , PropertyDescriptor { [[Value]] : F , [[Writable]] : writablePrototype , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] :
writablePrototype , [[Enumerable]] :
false , [[Configurable]] :
false })를 수행한다.
unused 를 반환한다.
10.2.6 MakeClassConstructor ( F )
추상 연산 MakeClassConstructor는 F (ECMAScript 함수 객체 )를 인자로 받아
unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
F .[[IsClassConstructor]] 가 false 임을
보장한다.
F .[[IsClassConstructor]] 를 true 로
설정한다.
unused 를 반환한다.
10.2.7 MakeMethod ( F , homeObject )
추상 연산 MakeMethod는 F (ECMAScript 함수 객체 )와 homeObject (객체)를 인자로 받아
unused 를 반환한다. 이 연산은 F 를 메서드로 설정한다. 호출 시 다음 단계를 수행한다:
Assert :
homeObject 가 일반 객체 임을 보장한다.
F .[[HomeObject]] 를 homeObject 로 설정한다.
unused 를 반환한다.
10.2.8 DefineMethodProperty ( homeObject , key ,
closure , enumerable )
추상 연산 DefineMethodProperty는 homeObject (객체), key (프로퍼티 키 또는
Private
Name ), closure (함수 객체 ), enumerable
(불리언)을 인자로 받고, 정상 완료 로서 PrivateElement 또는
unused 를 반환하거나, abrupt
completion 을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
homeObject 는 일반적이고 확장 가능한 객체임을 보장한다.
key 가 Private Name 라면,
PrivateElement
{ [[Key]] : key , [[Kind]] : method , [[Value]] : closure }를 반환한다.
그 외의 경우,
desc 를 PropertyDescriptor { [[Value]] :
closure , [[Writable]] :
true , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 둔다.
? DefinePropertyOrThrow (homeObject ,
key , desc )를 수행한다.
참고: DefinePropertyOrThrow 는
클래스 정적 메서드의 key 가 "prototype" 일 때만 abrupt
completion 을 반환한다.
unused 를 반환한다.
10.2.9 SetFunctionName ( F , name [ ,
prefix ] )
추상 연산 SetFunctionName은 F (함수 객체 ), name (프로퍼티 키 또는
Private
Name ), 선택적 prefix (문자열)를 인자로 받아 unused 를
반환한다. 이 연산은 F 에 "name" 프로퍼티를 추가한다. 호출 시 다음 단계를 수행한다:
단언 :
F 는
확장 가능한 객체이며 "name" 자체 속성을 가지지 않습니다.
만약 name 이 Symbol 이라면, 다음을
수행합니다.
description 을 name .[[Description]] 로 설정합니다.
만약 description 이 undefined 라면, name 을 빈
문자열로 설정합니다.
그 외의 경우, name 을 문자열 연결 로
"[" ,
description , 그리고 "]" 로 설정합니다.
그 외에 name 이 프라이빗 네임 이라면, 다음을 수행합니다.
name 을 name .[[Description]] 로
설정합니다.
만약 F 가 [[InitialName]] 내부 슬롯을 가지고 있다면, 다음을 수행합니다.
F .[[InitialName]] 을 name 으로 설정합니다.
만약 prefix 가 존재한다면, 다음을 수행합니다.
name 을 문자열 연결 로 prefix ,
코드 유닛 0x0020 (공백), 그리고 name 으로 설정합니다.
만약 F 가 [[InitialName]] 내부 슬롯을 가지고 있다면, 다음을
선택적으로 수행합니다.
F .[[InitialName]] 을 name 으로
설정합니다.
! DefinePropertyOrThrow (F ,
"name" , PropertyDescriptor { [[Value]] :
name ,
[[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true })를 수행합니다.
unused 를 반환합니다.
10.2.10 SetFunctionLength ( F , length )
추상 연산 SetFunctionLength는 F (함수 객체 ), length (0 이상의 정수 또는 +∞)를 인자로 받아
unused 를 반환한다. 이 연산은 F 에 "length" 프로퍼티를 추가한다.
호출 시 다음 단계를 수행한다:
Assert :
F 는 "length" 자신의 프로퍼티가 없는 확장 가능한 객체임을 보장한다.
! DefinePropertyOrThrow (F ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
unused 를 반환한다.
10.2.11 FunctionDeclarationInstantiation ( func ,
argumentsList )
추상 연산 FunctionDeclarationInstantiation은 func (ECMAScript 함수 객체 ),
argumentsList (ECMAScript 언어 값의
리스트 )를 인자로 받아, unused를 포함하는 정상
완료 또는 throw
completion 을 반환한다. func 는 실행 컨텍스트 가 설정될 함수 객체이다.
참고 1
ECMAScript 함수의 평가를 위해 실행 컨텍스트 가 설정되면 새로운 Function Environment
Record 가 생성되고, 각 형식 매개변수에 대한 바인딩이 해당 Environment Record 에 인스턴스화된다. 함수
본문의 각 선언도 인스턴스화된다. 함수의 형식 매개변수에 기본값 이니셜라이저가 없으면 본문 선언은 매개변수와 같은 Environment Record 에서 인스턴스화된다. 기본값
매개변수 이니셜라이저가 있으면, 본문 선언을 위한 두 번째 Environment Record 가
생성된다. 형식 매개변수와 함수는 FunctionDeclarationInstantiation의 일부로 초기화된다. 그 외의 모든 바인딩은 함수 본문 평가 중에
초기화된다.
호출 시 다음 단계를 수행한다:
calleeContext 를 실행 중인 실행 컨텍스트 로 둔다.
code 를 func .[[ECMAScriptCode]] 로 둔다.
strict 를 func .[[Strict]] 로 둔다.
formals 를 func .[[FormalParameters]] 로 둔다.
parameterNames 를 BoundNames of
formals 로 둔다.
parameterNames 에 중복 항목이 있으면 hasDuplicates 를
true 로, 아니면 false 로 둔다.
simpleParameterList 를 IsSimpleParameterList
of formals 로 둔다.
hasParameterExpressions 를 ContainsExpression
of formals 로 둔다.
varNames 를 VarDeclaredNames of
code 로 둔다.
varDeclarations 를 VarScopedDeclarations
of code 로 둔다.
lexicalNames 를 LexicallyDeclaredNames
of code 로 둔다.
functionNames 를 새로운 빈 List 로 둔다.
functionsToInitialize 를 새로운 빈 List 로 둔다.
varDeclarations 의 각 요소 d 에 대해, List 의 역순으로, 다음을
수행한다:
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 어느 것도
아니면,
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이다.
fn 을 BoundNames
of d 의 유일한 요소로 둔다.
functionNames 에 fn 이 포함되어 있지 않으면,
fn 을 functionNames 의 첫 번째 요소로 삽입한다.
참고: 같은 이름의 함수 선언이 여러 번 있으면 마지막 선언이 사용된다.
d 를 functionsToInitialize 의 첫 번째 요소로 삽입한다.
argumentsObjectNeeded 를 true 로 둔다.
func .[[ThisMode]] 가 lexical 이면,
참고: 화살표 함수는 arguments 객체를 갖지 않는다.
argumentsObjectNeeded 를 false 로 설정한다.
그 외에 parameterNames 에 "arguments" 가 포함되어 있으면,
argumentsObjectNeeded 를 false 로 설정한다.
그 외에 hasParameterExpressions 가 false 이면,
functionNames 에 "arguments" 가 포함되어 있거나
lexicalNames 에 "arguments" 가 포함되어 있으면,
argumentsObjectNeeded 를 false 로 설정한다.
strict 가 true 이거나 hasParameterExpressions 가
false 이면,
참고: 엄격 모드 코드 에서 eval
호출은 외부 바인딩을 볼 수 있는 새로운 바인딩을 만들 수 없으므로 매개변수에 대해 단일 Environment Record 만 필요하다.
env 를 calleeContext 의 LexicalEnvironment로 둔다.
그 외의 경우,
참고: 형식 매개변수 목록에서 직접
eval 호출로 생성된 바인딩이 매개변수가 선언된 환경 외부에 있도록 별도의 Environment Record 가 필요하다.
calleeEnv 를 calleeContext 의 LexicalEnvironment로 둔다.
env 를 NewDeclarativeEnvironment (calleeEnv )로
둔다.
Assert :
calleeContext 의 VariableEnvironment와 calleeEnv 는 같은
Environment Record 이다.
calleeContext 의 LexicalEnvironment를 env 로 설정한다.
parameterNames 의 각 문자열 paramName 에 대해,
alreadyDeclared 를
! env .HasBinding(paramName )으로 둔다.
참고: Early
errors 는 중복 매개변수 이름이 비엄격 함수 에서만 발생하고,
이때 기본값이나 rest 파라미터가 없어야 함을 보장한다.
alreadyDeclared 가 false 이면,
! env .CreateMutableBinding(paramName ,
false )을 수행한다.
hasDuplicates 가 true 이면,
! env .InitializeBinding(paramName ,
undefined )을 수행한다.
argumentsObjectNeeded 가 true 이면,
strict 가 true 이거나 simpleParameterList 가
false 이면,
ao 를 CreateUnmappedArgumentsObject (argumentsList )로
둔다.
그 외의 경우,
참고: rest 파라미터, 기본값 이니셜라이저, 구조 분해 파라미터가 없는 비엄격 함수 에만 mapped
arguments 객체가 제공된다.
ao 를 CreateMappedArgumentsObject (func ,
formals , argumentsList , env )로 둔다.
strict 가 true 이면,
! env .CreateImmutableBinding("arguments" ,
false )을 수행한다.
참고: 엄격 모드 코드 에서는
early errors 가 이 바인딩에 할당을 시도하는
것을 방지하므로, mutability가 관찰되지 않는다.
그 외의 경우,
! env .CreateMutableBinding("arguments" ,
false )을 수행한다.
! env .InitializeBinding("arguments" ,
ao )를 수행한다.
parameterBindings 를 list-concatenation of
parameterNames 및 « "arguments" »로 둔다.
그 외의 경우,
parameterBindings 를 parameterNames 로 둔다.
iteratorRecord 를 CreateListIteratorRecord (argumentsList )로
둔다.
hasDuplicates 가 true 이면,
usedEnv 를 undefined 로 둔다.
그 외의 경우,
usedEnv 를 env 로 둔다.
참고: 다음 단계는 ReturnCompletion 을 반환할 수 없다. 왜냐하면 식
위치에서 그런 완료가 발생할 수 있는 유일한 방법은 YieldExpression 을 사용하는 것인데, 이는
15.5.1
및 15.6.1 의
Early Error 규칙에 의해 파라미터 리스트에서 금지되어 있기 때문이다.
? IteratorBindingInitialization of
formals with arguments iteratorRecord 및 usedEnv 를 수행한다.
hasParameterExpressions 가 false 이면,
참고: 매개변수와 top-level var를 위해 단일 Environment
Record 만 필요하다.
instantiatedVarNames 를 parameterBindings 의 복사본으로 둔다.
varNames 의 각 요소 n 에 대해,
instantiatedVarNames 에 n 이 없으면,
n 을 instantiatedVarNames 에 추가한다.
! env .CreateMutableBinding(n ,
false )을 수행한다.
! env .InitializeBinding(n ,
undefined )을 수행한다.
varEnv 를 env 로 둔다.
그 외의 경우,
참고: 형식 매개변수 리스트 내 식에서 생성된 클로저가 함수 본문 내 선언을 볼 수 없도록 별도의 Environment Record 가 필요하다.
varEnv 를 NewDeclarativeEnvironment (env )로
둔다.
calleeContext 의 VariableEnvironment를 varEnv 로 설정한다.
instantiatedVarNames 를 새로운 빈 List 로 둔다.
varNames 의 각 요소 n 에 대해,
instantiatedVarNames 에 n 이 없으면,
n 을 instantiatedVarNames 에 추가한다.
! varEnv .CreateMutableBinding(n ,
false )을 수행한다.
parameterBindings 에 n 이 없거나
functionNames 에 n 이 있으면,
initialValue 를 undefined 로
둔다.
그 외의 경우,
initialValue 를
! env .GetBindingValue(n ,
false )로 둔다.
! varEnv .InitializeBinding(n ,
initialValue )를 수행한다.
참고: 형식 매개변수와 같은 이름의 var는 해당 초기화된 파라미터와 같은 값을 처음 가진다.
참고: 부록 B.3.2.1 은
이 위치에 추가 단계를 둔다.
strict 가 false 이면,
lexEnv 를 NewDeclarativeEnvironment (varEnv )로
둔다.
참고: 비엄격 함수 는 top-level lexical 선언을
위해 별도의 Environment Record 를 사용하며,
이는 직접
eval 이 eval 코드로 도입한 var 범위 선언이 기존 top-level lexical 선언과
충돌하는지 판단할 수 있도록 한다. 엄격 함수 에는 필요하지 않다. 엄격 직접
eval 은 항상 모든 선언을 새로운 Environment Record 에
위치시킨다.
그 외의 경우,
lexEnv 를 varEnv 로 둔다.
calleeContext 의 LexicalEnvironment를 lexEnv 로 설정한다.
lexDeclarations 를 LexicallyScopedDeclarations
of code 로 둔다.
lexDeclarations 의 각 요소 d 에 대해,
참고: lexical 선언된 이름은 함수/제너레이터 선언, 형식 매개변수, var 이름과 같을 수 없다. lexical 선언된 이름은 여기서
인스턴스화만 되고 초기화되지 않는다.
BoundNames of
d 의 각 요소 dn 에 대해,
IsConstantDeclaration
of d 가 true 이면,
! lexEnv .CreateImmutableBinding(dn ,
true )를 수행한다.
그 외의 경우,
! lexEnv .CreateMutableBinding(dn ,
false )를 수행한다.
privateEnv 를 calleeContext 의 PrivateEnvironment로 둔다.
functionsToInitialize 의 각 파스 노드 f 에
대해,
fn 을 BoundNames of
f 의 유일한 요소로 둔다.
fo 를 InstantiateFunctionObject
of f with arguments lexEnv 및 privateEnv 로 둔다.
! varEnv .SetMutableBinding(fn , fo ,
false )를 수행한다.
unused 를 반환한다.
참고 2
B.3.2
는 ECMAScript 2015 이전의 웹 브라우저 구현과의 하위 호환성을 위해 위 알고리즘에 대한 확장을 제공한다.
10.3 내장 함수 객체
내장 함수 객체 는
일반 객체 이며,
일반 객체 에 대한
10.1 의 요구사항을
반드시 만족해야 합니다.
모든 일반 객체 에
요구되는 내부 슬롯(자세한 내용은 10.1 참고) 외에,
내장 함수 객체 는
다음 내부 슬롯도 반드시 가져야 합니다:
내장 함수 객체 의
[[Prototype]] 내부 슬롯의 초기값은 별도의 명시가 없는 한 %Function.prototype% 입니다.
내장 함수 객체 는
10.3.1 에
정의된 [[Call]] 내부 메서드를 반드시 가져야 합니다.
내장 함수 객체 는
“생성자 ”로 기술되어 있거나,
이 명세의 어떤 알고리즘이 명시적으로 [[Construct]] 내부 메서드를 설정한 경우에만 [[Construct]] 내부 메서드를 가집니다. 이러한 [[Construct]] 내부
메서드는 반드시 10.3.2 에
정의된 내용을 따라야 합니다.
구현체는 이 명세에 정의되지 않은 추가적인 내장 함수 객체 를 제공할 수 있습니다.
10.3.1 [[Call]] ( thisArgument ,
argumentsList )
내장 함수
객체 F 의 [[Call]] 내부 메서드는
thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값의
리스트 )를 인자로 받아, ECMAScript 언어 값 를 포함하는
정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
? BuiltinCallOrConstruct (F ,
thisArgument , argumentsList , undefined )를 반환한다.
10.3.2 [[Construct]] (
argumentsList , newTarget )
내장 함수
객체 F 의 [[Construct]] 내부 메서드(존재하는 경우)는
argumentsList (ECMAScript 언어 값의
리스트 ), newTarget (생성자 )를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
result 를 ? BuiltinCallOrConstruct (F ,
uninitialized , argumentsList , newTarget )로
둔다.
Assert :
result 가 객체 임을 보장한다.
result 를 반환한다.
10.3.3 BuiltinCallOrConstruct ( F ,
thisArgument , argumentsList , newTarget )
BuiltinCallOrConstruct 추상 연산은 F (내장 함수 객체 ), thisArgument
(ECMAScript 언어 값 또는
uninitialized ), argumentsList (ECMAScript 언어 값의 리스트 ),
newTarget (생성자 또는 undefined )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을 반환한다.
호출 시 다음 단계를 수행한다:
callerContext 를 실행 중인 실행 컨텍스트 로 둔다.
callerContext 가 이미 일시정지(suspended) 상태가 아니면, callerContext 를 일시정지시킨다.
calleeContext 를 새로운 실행 컨텍스트 로 둔다.
calleeContext 의 Function을 F 로 설정한다.
calleeRealm 을 F .[[Realm]] 로 둔다.
calleeContext 의 Realm 을 calleeRealm 으로 설정한다.
calleeContext 의 ScriptOrModule을 null 로 설정한다.
calleeContext 의 구현체 정의 초기화(implementation-defined initialization)를 수행한다.
calleeContext 를 실행 컨텍스트 스택 에 푸시한다;
calleeContext 는 이제 실행 중인 실행 컨텍스트 이다.
result 를 Completion
Record 로, F 를 이 명세에 정의된 대로 평가한
결과 로 둔다. thisArgument 가 uninitialized 이면
this 값은 미초기화 상태이고, 아니면 thisArgument 가
this 값을 제공한다. argumentsList 는 명명된 파라미터를 제공하며,
newTarget 은 NewTarget 값을 제공한다.
참고: F 가 이 문서에서 정의된 경우, “the specification of F ”는 알고리즘 단계 또는 그 외
수단으로 명세된 동작이다.
calleeContext 를 실행 컨텍스트 스택 에서 제거하고,
callerContext 를 실행 중인 실행 컨텍스트 로 복원한다.
? result 를 반환한다.
참고
calleeContext 가 실행 컨텍스트 스택 에서 제거될 때, 접근 가능한
Generator에 의해 나중에 재개(resume)될 수 있도록 일시정지(suspend) 상태라면 파괴되어서는 안 됩니다.
10.3.4 CreateBuiltinFunction ( behaviour ,
length , name , additionalInternalSlotsList [ , realm
[ , prototype [ , prefix ] ] ] )
CreateBuiltinFunction 추상 연산은 behaviour (Abstract Closure , 알고리즘 단계 집합,
또는 명세 내에서 함수 동작을 정의한 기타 수단), length (0 이상의 정수 또는 +∞), name (프로퍼티 키 또는
Private
Name ), additionalInternalSlotsList (내부 슬롯 이름 리스트 ), 그리고 선택적
realm (Realm
Record ), prototype (객체 또는 null ),
prefix (문자열)을 인자로 받아 내장 함수 객체 를 반환한다.
additionalInternalSlotsList 에는 객체의 일부로 정의되어야 하는 추가 내부 슬롯 이름이 포함된다. 이 연산은 내장 함수 객체 를
생성한다. 호출 시 다음 단계를 수행한다:
realm 이 없으면 realm 을 현재 Realm Record 로 설정한다.
prototype 이 없으면 prototype 을 realm .[[Intrinsics]] .[[%Function.prototype% ]]로
설정한다.
internalSlotsList 를, 생성할 내장 함수 객체 에 대해 10.3 이 요구하는 모든 내부 슬롯의 이름을
포함하는 List 로 둔다.
internalSlotsList 끝에 additionalInternalSlotsList 의 모든 요소를 추가한다.
func 를, 호출 시 behaviour 에서 명시된 대로 해당 인자를 파라미터 값으로 사용하여 행동하는 새로운 내장
함수
객체 로 둔다. 새 함수 객체 는 internalSlotsList 의 이름을
가진 내부 슬롯들과, [[InitialName]] 내부 슬롯을 가진다.
func .[[Prototype]] 을 prototype 으로 설정한다.
func .[[Extensible]] 을 true 로 설정한다.
func .[[Realm]] 을 realm 으로 설정한다.
func .[[InitialName]] 을 null 로 설정한다.
SetFunctionLength (func ,
length )를 수행한다.
prefix 가 없으면,
SetFunctionName (func ,
name )을 수행한다.
그 외의 경우,
SetFunctionName (func ,
name , prefix )를 수행한다.
func 를 반환한다.
이 명세에 정의된 모든 내장 함수는 CreateBuiltinFunction 추상 연산을 호출하여 생성된다.
10.4 내장 익조틱(Exotic) 객체의 내부 메서드와 슬롯
이 명세는 여러 종류의 내장 익조틱
객체 를 정의합니다. 이러한 객체들은 몇몇 특정 상황을 제외하면 일반적으로 일반 객체 와 비슷하게 동작합니다. 아래의 익조틱 객체 들은 별도로 명시된
경우를 제외하고는 일반
객체 의 내부 메서드를 사용합니다:
10.4.1 바운드 함수 익조틱 객체
바운드 함수 익조틱 객체 는 또 다른 함수 객체 를 감싸는
익조틱
객체 입니다. 바운드 함수 익조틱 객체 는 호출 가능하며([[Call]] 내부 메서드를 가지고 있을 수 있고, [[Construct]] 내부
메서드도 가질 수 있습니다), 이를 호출하면 일반적으로 감싸고 있는 함수가 호출됩니다.
객체가 [[Call]] 및 (해당되는 경우) [[Construct]] 내부 메서드가
아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 바운드 함수 익조틱 객체 입니다. 이러한 메서드는 BoundFunctionCreate 에서
설치됩니다.
바운드 함수 익조틱 객체 는 표 30 에 나열된
ECMAScript 함수
객체 의 내부 슬롯을 가지지 않습니다. 대신, [[Prototype]] 및 [[Extensible]] 와 더불어 표 31 에 나열된
내부 슬롯을 가집니다.
표 31: 바운드 함수 익조틱 객체의 내부 슬롯
내부 슬롯
타입
설명
[[BoundTargetFunction]]
호출 가능한 객체
감싸고 있는 함수 객체 .
[[BoundThis]]
ECMAScript 언어 값
감싸고 있는 함수를 호출할 때 항상 this 값으로 전달되는 값입니다.
[[BoundArguments]]
리스트
(ECMAScript 언어
값 의 리스트)
감싸고 있는 함수를 호출할 때 항상 첫 번째 인수로 전달되는 값들의 리스트입니다.
10.4.1.1 [[Call]] (
thisArgument , argumentsList )
바운드 함수 익조틱 객체 F 의 [[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값
리스트 )를 인자로 받아, ECMAScript 언어 값 를
포함하는 정상 완료 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
target 를 F .[[BoundTargetFunction]] 으로
둔다.
boundThis 를 F .[[BoundThis]] 로 둔다.
boundArgs 를 F .[[BoundArguments]] 로 둔다.
args 를 리스트 연결 (boundArgs ,
argumentsList )로 둔다.
? Call (target ,
boundThis , args )를 반환한다.
10.4.1.2 [[Construct]] (
argumentsList , newTarget )
바운드 함수 익조틱 객체 F 의 [[Construct]] 내부 메서드는 argumentsList (ECMAScript 언어 값 리스트 ),
newTarget (생성자 )를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
target 를 F .[[BoundTargetFunction]] 으로
둔다.
Assert :
IsConstructor (target )가
true 임을 보장한다.
boundArgs 를 F .[[BoundArguments]] 로 둔다.
args 를 리스트 연결 (boundArgs ,
argumentsList )로 둔다.
SameValue (F ,
newTarget )가 true 이면, newTarget 를
target 으로 설정한다.
? Construct (target ,
args , newTarget )를 반환한다.
10.4.1.3 BoundFunctionCreate ( targetFunction ,
boundThis , boundArgs )
BoundFunctionCreate 추상 연산은 targetFunction (함수 객체 ), boundThis
(ECMAScript 언어 값 ),
boundArgs (ECMAScript 언어 값
리스트 )를 인자로 받아, 함수 객체 를 포함하는 정상 완료 또는 throw completion 을
반환한다. 이 연산은 새로운 바운드 함수 익조틱 객체 의 생성을 명세하는 데 사용된다.
호출 시 다음 단계를 수행한다:
proto 를 ? targetFunction .[[GetPrototypeOf]] ()로 둔다.
internalSlotsList 를 리스트 연결 로 « [[Prototype]] , [[Extensible]] »와 표
31 에 나열된 내부 슬롯들을 합친 것으로 둔다.
obj 를 MakeBasicObject (internalSlotsList )로
둔다.
obj .[[Prototype]] 을 proto 로 설정한다.
obj .[[Call]] 을 10.4.1.1 에서
설명한 대로 설정한다.
IsConstructor (targetFunction )
가 true 이면,
obj .[[Construct]] 를 10.4.1.2 에서
설명한 대로 설정한다.
obj .[[BoundTargetFunction]] 을
targetFunction 으로 설정한다.
obj .[[BoundThis]] 를 boundThis 로 설정한다.
obj .[[BoundArguments]] 를 boundArgs 로
설정한다.
obj 를 반환한다.
10.4.2 배열 익조틱 객체
배열(Array)은 익조틱
객체 로, 배열 인덱스 프로퍼티 키 에 대해 특별한 처리를 합니다(자세한 내용은
6.1.7
참고). 프로퍼티
이름 이 배열 인덱스 인 프로퍼티는 요소(element) 라고도 부릅니다. 모든 배열은 항상
0 이상의 정수(Number) 값을 가지며, 그 수학적
값 이 232 미만인, 변경 불가능(non-configurable)한
"length" 프로퍼티를 가집니다. "length" 프로퍼티의 값은 그 이름이 배열 인덱스 인 모든 자신의 프로퍼티
이름보다 숫자적으로 큽니다. 배열의 자신의 프로퍼티가 생성되거나 변경될 때마다 이 불변식(invariant)을 유지하기 위해 다른 프로퍼티들도 필요에 따라 조정됩니다.
구체적으로, 이름이 배열
인덱스 인 자신의 프로퍼티가 추가되면, 필요하다면 "length" 프로퍼티의 값을 해당
배열 인덱스 의 수치값 +
1로 변경합니다. 그리고 "length" 의 값이 변경될 때마다, 그 값 이상인 모든 배열 인덱스 이름을 가진 자신의 프로퍼티를 삭제합니다. 이 제약은
배열의 자신의 프로퍼티에만 적용되며, "length" 나 배열 인덱스 프로퍼티가 프로토타입에서 상속된 경우에는 영향을 미치지
않습니다.
객체의 [[DefineOwnProperty]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드가 10.1 의 정의를
따른다면, 그 객체는 배열 익조틱
객체 (또는 간단히 배열)입니다. 이러한 메서드는 ArrayCreate 에서 설치됩니다.
10.4.2.1 [[DefineOwnProperty]] (
P , Desc )
배열 익조틱
객체 A 의 [[DefineOwnProperty]] 내부
메서드는 P (프로퍼티 키 ), Desc (프로퍼티 디스크립터 )를 인자로
받고, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 "length" 이면,
? ArraySetLength (A ,
Desc )를 반환합니다.
그 외에 P 가 배열 인덱스 이면,
lengthDesc 를 OrdinaryGetOwnProperty (A ,
"length" )로 둔다.
Assert :
lengthDesc 가 undefined 가 아님을 보장합니다.
Assert :
IsDataDescriptor (lengthDesc )가
true 임을 보장합니다.
Assert :
lengthDesc .[[Configurable]] 가
false 임을 보장합니다.
length 를 lengthDesc .[[Value]] 로
둔다.
Assert :
length 가 0 이상의 정수(Number) 임을 보장합니다.
index 를 ! ToUint32 (P )로 둡니다.
index ≥ length 이고 lengthDesc .[[Writable]] 이 false 이면,
false 를 반환합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
P , Desc )로 둡니다.
succeeded 가 false 이면, false 를
반환합니다.
index ≥ length 이면,
lengthDesc .[[Value]] 를
index + 1 𝔽 로 설정합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , lengthDesc )로 둡니다.
Assert : succeeded 가
true 임을 보장합니다.
true 를 반환합니다.
? OrdinaryDefineOwnProperty (A ,
P , Desc )를 반환합니다.
10.4.2.2 ArrayCreate ( length [ , proto ]
)
ArrayCreate 추상 연산은 length (0 이상의 정수 ), 선택적 proto (객체)를 인자로 받아, 배열 익조틱
객체 를 포함하는 정상 완료
또는 throw completion 을
반환합니다. 이는 새로운 배열 생성 시 사용됩니다. 호출 시 다음 단계를 수행합니다:
length > 232 - 1이면 RangeError 예외를 던집니다.
proto 가 없으면 proto 를 %Array.prototype% 로
설정합니다.
A 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] »)로 둡니다.
A .[[Prototype]] 을 proto 로 설정합니다.
A .[[DefineOwnProperty]] 를 10.4.2.1 에
명시된 대로 설정합니다.
! OrdinaryDefineOwnProperty (A ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })를 수행합니다.
A 를 반환합니다.
10.4.2.3 ArraySpeciesCreate ( originalArray ,
length )
ArraySpeciesCreate 추상 연산은 originalArray (객체), length (0 이상의 정수 )를 인자로 받아, 객체를 포함하는
정상 완료 또는 throw completion 을
반환합니다. 이는 originalArray 에서 파생된 생성자 함수를 사용해 새로운 배열 또는 유사 객체를 생성할 때 사용됩니다. 여기서
생성자 함수가
반드시 Array를 반환할 필요는 없습니다. 호출 시 다음 단계를 수행합니다:
isArray 를 ? IsArray (originalArray )로 둡니다.
isArray 가 false 이면 ? ArrayCreate (length )를
반환합니다.
C 를 ? Get (originalArray ,
"constructor" )로 둡니다.
IsConstructor (C )가
true 이면,
thisRealm 을 현재 Realm Record 로 둡니다.
realmC 를 ? GetFunctionRealm (C )로
둡니다.
thisRealm 과 realmC 가 동일한 Realm Record 가 아니면,
SameValue (C ,
realmC .[[Intrinsics]] .[[%Array% ]])가
true 이면 C 를
undefined 로 둡니다.
C 가 객체 이면,
C 를 ? Get (C ,
%Symbol.species% )로
둡니다.
C 가 null 이면 C 를
undefined 로 둡니다.
C 가 undefined 이면 ? ArrayCreate (length )를
반환합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 던집니다.
? Construct (C , « 𝔽 (length ) »)를 반환합니다.
참고
originalArray 가 realm 이 실행 중인 실행 컨텍스트 의 realm 와 다를 때, 표준 내장
Array 생성자 로 생성된 경우에는 실행 중인 실행 컨텍스트 의 realm 에서 새로운 배열이
생성됩니다. 이는 ArraySpeciesCreate를 사용하는 Array.prototype 메서드가 역사적으로 웹 브라우저에서
이런 동작을 보였던 것과의 호환성을 유지하기 위한 것입니다.
10.4.2.4 ArraySetLength ( A , Desc )
ArraySetLength 추상 연산은 A (배열), Desc (프로퍼티 디스크립터 )를 인자로
받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
Desc 에 [[Value]] 필드가 없으면,
! OrdinaryDefineOwnProperty (A ,
"length" , Desc )를 반환합니다.
newLenDesc 를 Desc 의 복사본으로 둔다.
newLen 를 ? ToUint32 (Desc .[[Value]] )로 둔다.
numberLen 를 ? ToNumber (Desc .[[Value]] )로 둔다.
SameValueZero (newLen ,
numberLen )이 false 이면 RangeError 예외를
던집니다.
newLenDesc .[[Value]] 를 newLen 로 설정합니다.
oldLenDesc 를 OrdinaryGetOwnProperty (A ,
"length" )로 둡니다.
Assert :
oldLenDesc 가 undefined 가 아님을 보장합니다.
Assert :
IsDataDescriptor (oldLenDesc )가
true 임을 보장합니다.
Assert :
oldLenDesc .[[Configurable]] 가
false 임을 보장합니다.
oldLen 을 oldLenDesc .[[Value]] 로 둡니다.
newLen ≥ oldLen 이면,
! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )를 반환합니다.
oldLenDesc .[[Writable]] 이
false 이면, false 를 반환합니다.
newLenDesc 에 [[Writable]] 필드가 없거나
newLenDesc .[[Writable]] 이
true 이면,
newWritable 을 true 로 둡니다.
그 외의 경우,
참고: [[Writable]] 속성을 false 로 설정하는
것은 요소 삭제에 실패하는 경우를 대비해 미룹니다.
newWritable 을 false 로 둡니다.
newLenDesc .[[Writable]] 을
true 로 설정합니다.
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )로 둡니다.
succeeded 가 false 이면, false 를 반환합니다.
자신의 프로퍼티
키 P 중, P 가 배열 인덱스 이고, ! ToUint32 (P ) ≥
newLen 인 모든 P 에 대해, 내림차순 숫자 인덱스 순으로,
deleteSucceeded 를 ! A .[[Delete]] (P )로 둡니다.
deleteSucceeded 가 false 이면,
newLenDesc .[[Value]] 를
! ToUint32 (P ) +
1 𝔽 로 설정합니다.
newWritable 이 false 이면,
newLenDesc .[[Writable]] 을
false 로 설정합니다.
! OrdinaryDefineOwnProperty (A ,
"length" , newLenDesc )를 수행합니다.
false 를 반환합니다.
newWritable 이 false 이면,
succeeded 를 ! OrdinaryDefineOwnProperty (A ,
"length" , PropertyDescriptor { [[Writable]] : false })로 둡니다.
Assert :
succeeded 가 true 임을 보장합니다.
true 를 반환합니다.
참고
3 및 4 단계에서
Desc .[[Value]] 가 객체인 경우 valueOf 메서드가
두 번 호출됩니다. 이는 2판(Edition 2) 명세에서 이 효과를 명시한 이후로 유지되고 있는 레거시 동작입니다.
10.4.3 문자열 익조틱 객체
String 객체는 문자열 값을 캡슐화하고, 해당 문자열 값의 각 코드 유닛 요소에 대응하는 가상 정수 인덱스 데이터 프로퍼티 를
노출하는 익조틱
객체 입니다. 문자열 익조틱 객체 는 항상 캡슐화된 문자열 값의 길이를 값으로 갖는
"length" 라는 이름의 데이터 프로퍼티 를 가집니다. 코드 유닛 데이터 프로퍼티 와
"length" 프로퍼티 모두 쓰기 불가 및 재정의 불가(non-configurable)입니다.
객체의 [[GetOwnProperty]] , [[DefineOwnProperty]] ,
[[OwnPropertyKeys]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 문자열
익조틱 객체 (혹은 간단히 String 객체)입니다. 이 메서드들은 StringCreate 에서 설치됩니다.
문자열 익조틱
객체 는 일반 객체 와 동일한 내부 슬롯을 가지며, 추가로 [[StringData]] 내부 슬롯을 가집니다.
10.4.3.1 [[GetOwnProperty]] (
P )
문자열 익조틱
객체 S 의 [[GetOwnProperty]] 내부 메서드는
P (프로퍼티
키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
desc 를 OrdinaryGetOwnProperty (S ,
P )로 둡니다.
desc 가 undefined 가 아니면 desc 를 반환합니다.
StringGetOwnProperty (S ,
P )를 반환합니다.
10.4.3.2 [[DefineOwnProperty]] (
P , Desc )
문자열 익조틱
객체 S 의 [[DefineOwnProperty]] 내부
메서드는 P (프로퍼티 키 ), Desc (프로퍼티 디스크립터 )를 인자로
받아, 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
stringDesc 를 StringGetOwnProperty (S ,
P )로 둡니다.
stringDesc 가 undefined 가 아니면,
extensible 을 S .[[Extensible]] 로
둔다.
IsCompatiblePropertyDescriptor (extensible ,
Desc , stringDesc )를 반환한다.
! OrdinaryDefineOwnProperty (S ,
P , Desc )를 반환한다.
10.4.3.3 [[OwnPropertyKeys]] ( )
문자열 익조틱
객체 O 의 [[OwnPropertyKeys]] 내부 메서드는
인자를 받지 않으며, 프로퍼티
키 의 리스트 를
포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
keys 를 새로운 빈 리스트 로 둔다.
str 을 O .[[StringData]] 로 둔다.
Assert :
str 이 문자열 임을 보장한다.
len 을 str 의 길이로 둔다.
0 ≤ i < len 인 모든 정수 i 에 대해 오름차순으로,
! ToString (𝔽 (i ))를
keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 배열 인덱스 이고, ! ToIntegerOrInfinity (P )
≥ len 인 모든 P 에 대해 오름차순 숫자 인덱스 순서대로,
P 를 keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 문자열 이고
배열
인덱스 가 아닌 모든 P 에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
P 를 keys 에 추가한다.
자신의 프로퍼티
키 P 중, P 가 심볼 인 모든
P 에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
P 를 keys 에 추가한다.
keys 를 반환한다.
10.4.3.4 StringCreate ( value , prototype )
StringCreate 추상 연산은 value (문자열), prototype (객체)를 인자로 받아 문자열 익조틱
객체 를 반환한다. 이는 새로운 문자열 익조틱 객체 의 생성을 명세하는 데
사용된다. 호출 시 다음 단계를 수행한다:
S 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[StringData]] »)로 둔다.
S .[[Prototype]] 을 prototype 으로 설정한다.
S .[[StringData]] 를 value 로 설정한다.
S .[[GetOwnProperty]] 를 10.4.3.1 에
명시된 대로 설정한다.
S .[[DefineOwnProperty]] 를 10.4.3.2 에
명시된 대로 설정한다.
S .[[OwnPropertyKeys]] 를 10.4.3.3 에
명시된 대로 설정한다.
length 를 value 의 길이로 둔다.
! DefinePropertyOrThrow (S ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (length ),
[[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
S 를 반환한다.
10.4.3.5 StringGetOwnProperty ( S , P )
StringGetOwnProperty 추상 연산은 S ([[StringData]] 내부 슬롯이 있는
객체), P (프로퍼티 키 )를 인자로 받아, 프로퍼티 디스크립터 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
P 가 문자열 이 아니면
undefined 를 반환한다.
index 를 CanonicalNumericIndexString (P )로
둔다.
index 가 정수(Number) 가 아니면
undefined 를 반환한다.
index 가 -0 𝔽 이거나 index <
-0 𝔽 이면 undefined 를 반환한다.
str 을 S .[[StringData]] 로 둔다.
Assert :
str 이 문자열 임을 보장한다.
len 을 str 의 길이로 둔다.
ℝ (index ) ≥
len 이면 undefined 를 반환한다.
resultStr 를 substring (str , ℝ (index ),
ℝ (index ) +
1)로 둔다.
PropertyDescriptor { [[Value]] : resultStr , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false }를 반환한다.
10.4.4 Arguments 익조틱 객체
대부분의 ECMAScript 함수는 arguments 객체를 코드에서 사용할 수 있도록 제공합니다. 함수 정의의 특성에 따라, arguments 객체는 일반 객체 이거나
arguments 익조틱 객체 입니다. arguments
익조틱 객체 는 익조틱 객체 로, 배열 인덱스 프로퍼티가 관련 ECMAScript 함수의 호출 시 형식
매개변수 바인딩과 매핑됩니다.
객체의 내부 메서드가 아래 구현을 따르고, 여기 명시되지 않은 메서드는 10.1 의 정의를
따른다면, 그 객체는 arguments 익조틱 객체 입니다. 이러한 메서드는 CreateMappedArgumentsObject 에서
설치됩니다.
참고 1
Arguments 익조틱 객체 는 일반 객체 와 동일한
내부 슬롯을 가지고 있습니다. 또한 [[ParameterMap]] 내부 슬롯을 가집니다. 일반 arguments 객체도 [[ParameterMap]] 내부 슬롯을 가지지만, 그 값은 항상 undefined 입니다.
일반 arguments 객체에서 [[ParameterMap]] 내부 슬롯은
Object.prototype.toString (20.1.3.6 )에서 해당 객체임을
식별하는 데만 사용됩니다.
참고 2
arguments 익조틱 객체 의 정수 인덱스
데이터
프로퍼티 중 이름이 해당 함수 객체 의 형식 매개변수 개수보다 작은 것은 처음에 함수
실행 컨텍스트 의 인수 바인딩과 값을 공유합니다. 즉,
프로퍼티를 변경하면 인수 바인딩의 값도 바뀌고 그 반대도 마찬가지입니다. 이 대응은 해당 프로퍼티를 삭제 후 재정의하거나 접근자 프로퍼티로 바꾸면 끊어집니다.
arguments 객체가 일반 객체 라면, 프로퍼티의 값은 함수에 전달된 인수의 복사본일 뿐이며,
프로퍼티 값과 형식 매개변수 값 사이에 동적 연결은 없습니다.
참고 3
ParameterMap 객체와 그 프로퍼티 값은 arguments 객체와 인수 바인딩의 대응을 명세하기 위한 장치로 사용됩니다. ParameterMap 객체와
그 프로퍼티 값 객체는 ECMAScript 코드에서 직접 관찰할 수 없습니다. 명세된 의미론을 구현하기 위해, ECMAScript 구현체는 실제로 이러한
객체를 생성하거나 사용할 필요가 없습니다.
참고 4
일반 arguments 객체는 접근 시 TypeError 예외를 던지는 "callee" 라는
이름의 변경 불가 접근자 프로퍼티 를 정의합니다. arguments 익조틱 객체 는
"callee" 프로퍼티에 대해 좀 더 구체적인 의미를 가지며, 이는 일부 비엄격
함수 에 대해서만 생성됩니다. 일반 variant에서 이 프로퍼티를 정의하는 것은, ECMAScript 구현체가 이와
다른 방법으로 프로퍼티를 정의하지 않도록 보장하기 위함입니다.
참고 5
ECMAScript의 arguments 익조틱 객체 구현체는 역사적으로
"caller" 라는 접근자 프로퍼티를 포함하는 경우가 있었습니다. ECMAScript 2017 이전에는 이 명세서에 일반
arguments 객체에 대해 예외를 던지는 "caller" 프로퍼티 정의가 포함되어 있었습니다. 현재는 구현체가 더 이상
이 확장을 포함하지 않으므로, ECMAScript 2017에서 이 요구사항을 삭제하였습니다.
10.4.4.1 [[GetOwnProperty]] (
P )
arguments 익조틱 객체
args 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받아, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
desc 를 OrdinaryGetOwnProperty (args ,
P )로 둔다.
desc 가 undefined 이면 undefined 를 반환한다.
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 true 이면,
desc .[[Value]] 를 ! Get (map ,
P )로 설정한다.
desc 를 반환한다.
10.4.4.2 [[DefineOwnProperty]] (
P , Desc )
arguments 익조틱 객체
args 의 [[DefineOwnProperty]] 내부 메서드는 P
(프로퍼티
키 ), Desc (프로퍼티 디스크립터 )를 인자로
받아 불리언을 포함하는 정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
newArgDesc 를 Desc 로 둔다.
isMapped 가 true 이고 IsDataDescriptor (Desc )
가 true 이면,
Desc 에 [[Value]] 필드가 없고, Desc 에
[[Writable]] 필드가 있으면서 Desc .[[Writable]] 이 false 이면,
newArgDesc 를 Desc 의 복사본으로 둔다.
newArgDesc .[[Value]] 를
! Get (map ,
P )로 설정한다.
allowed 를 ! OrdinaryDefineOwnProperty (args ,
P , newArgDesc )로 둔다.
allowed 가 false 이면 false 를 반환한다.
isMapped 가 true 이면,
IsAccessorDescriptor (Desc )
가 true 이면,
! map .[[Delete]] (P )를 수행한다.
그 외의 경우,
Desc 에 [[Value]] 필드가 있으면,
Assert : 아래 Set은 반드시
성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
! Set (map ,
P , Desc .[[Value]] ,
false )를 수행한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 이
false 이면,
! map .[[Delete]] (P )를 수행한다.
true 를 반환한다.
10.4.4.3 [[Get]] ( P ,
Receiver )
arguments 익조틱 객체
args 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아,
ECMAScript 언어 값 를 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 false 이면,
? OrdinaryGet (args ,
P , Receiver )를 반환한다.
그 외의 경우,
Assert :
map 에 P 에 대한 형식 매개변수 매핑이 있음을 보장한다.
! Get (map ,
P )를 반환한다.
10.4.4.4 [[Set]] ( P ,
V , Receiver )
arguments 익조틱 객체
args 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받아, 불리언을
포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
SameValue (args ,
Receiver )가 false 이면,
isMapped 를 false 로 둔다.
그 외의 경우,
map 을 args .[[ParameterMap]] 로
둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
isMapped 가 true 이면,
Assert :
아래 Set은 반드시 성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
! Set (map ,
P , V , false )를 수행한다.
? OrdinarySet (args ,
P , V , Receiver )를 반환한다.
10.4.4.5 [[Delete]] ( P )
arguments 익조틱 객체
args 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받아, 불리언을 포함하는 정상 완료 또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
map 을 args .[[ParameterMap]] 로 둔다.
isMapped 를 ! HasOwnProperty (map ,
P )로 둔다.
result 를 ? OrdinaryDelete (args ,
P )로 둔다.
result 가 true 이고 isMapped 가
true 이면,
! map .[[Delete]] (P )를
수행한다.
result 를 반환한다.
10.4.4.6 CreateUnmappedArgumentsObject (
argumentsList )
추상 연산 CreateUnmappedArgumentsObject는 argumentsList (ECMAScript 언어 값의 리스트 )를
인자로 받아, 일반
객체 를 반환한다. 호출 시 다음 단계를 수행한다:
len 을 argumentsList 의 요소 개수로 둔다.
obj 를 OrdinaryObjectCreate (%Object.prototype% ,
« [[ParameterMap]] »)로 둔다.
obj .[[ParameterMap]] 을
undefined 로 설정한다.
! DefinePropertyOrThrow (obj ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (len ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
index 를 0으로 둔다.
index < len 인 동안 반복한다:
val 을 argumentsList [index ]로 둔다.
! CreateDataPropertyOrThrow (obj ,
! ToString (𝔽 (index )),
val )를 수행한다.
index 를 index + 1로 설정한다.
! DefinePropertyOrThrow (obj ,
%Symbol.iterator% ,
PropertyDescriptor { [[Value]] : %Array.prototype.values%,
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (obj ,
"callee" , PropertyDescriptor { [[Get]] :
%ThrowTypeError% , [[Set]] : %ThrowTypeError% ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
obj 를 반환한다.
10.4.4.7 CreateMappedArgumentsObject ( func ,
formals , argumentsList , env )
추상 연산 CreateMappedArgumentsObject는 func (객체), formals (파스
노드 ), argumentsList
(ECMAScript 언어 값의 리스트 ),
env (환경 레코드 )를 인자로 받아, arguments 익조틱 객체 를 반환한다. 호출 시 다음 단계를
수행한다:
Assert :
formals 는 rest 파라미터, 바인딩 패턴, 이니셜라이저를 포함하지 않는다. 중복 식별자를 포함할 수 있다.
len 을 argumentsList 의 요소 개수로 둔다.
obj 를 MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[ParameterMap]] »)로 둔다.
obj .[[GetOwnProperty]] 를 10.4.4.1 에
명시된 대로 설정한다.
obj .[[DefineOwnProperty]] 를 10.4.4.2 에
명시된 대로 설정한다.
obj .[[Get]] 을 10.4.4.3 에
명시된 대로 설정한다.
obj .[[Set]] 을 10.4.4.4 에
명시된 대로 설정한다.
obj .[[Delete]] 를 10.4.4.5 에 명시된
대로 설정한다.
obj .[[Prototype]] 을 %Object.prototype% 로
설정한다.
map 을 OrdinaryObjectCreate (null )로
둔다.
obj .[[ParameterMap]] 을 map 으로 설정한다.
parameterNames 를 BoundNames of
formals 로 둔다.
numberOfParameters 를 parameterNames 의 요소 개수로 둔다.
index 를 0으로 둔다.
index < len 인 동안 반복한다:
val 을 argumentsList [index ]로 둔다.
! CreateDataPropertyOrThrow (obj ,
! ToString (𝔽 (index )),
val )를 수행한다.
index 를 index + 1로 설정한다.
! DefinePropertyOrThrow (obj ,
"length" , PropertyDescriptor { [[Value]] :
𝔽 (len ),
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
mappedNames 를 새로운 빈 리스트 로 둔다.
index 를 numberOfParameters - 1로 둔다.
index ≥ 0인 동안 반복한다:
name 을 parameterNames [index ]로 둔다.
mappedNames 에 name 이 없으면,
name 을 mappedNames 에 추가한다.
index < len 이면,
g 를 MakeArgGetter (name ,
env )로 둔다.
p 를 MakeArgSetter (name ,
env )로 둔다.
! map .[[DefineOwnProperty]] (! ToString (𝔽 (index )),
PropertyDescriptor { [[Set]] :
p , [[Get]] :
g , [[Enumerable]] :
false , [[Configurable]] :
true })를 수행한다.
index 를 index - 1로 설정한다.
! DefinePropertyOrThrow (obj ,
%Symbol.iterator% ,
PropertyDescriptor { [[Value]] : %Array.prototype.values%,
[[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
! DefinePropertyOrThrow (obj ,
"callee" , PropertyDescriptor { [[Value]] :
func , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : true })를 수행한다.
obj 를 반환한다.
10.4.4.7.1 MakeArgGetter ( name , env )
추상 연산 MakeArgGetter는 name (문자열), env (환경
레코드 )를 인자로 받아, 함수 객체 를 반환한다. 이 연산은 env 에서
name 에 바인딩된 값을 반환하는 내장 함수 객체 를 생성한다. 호출 시 다음 단계를 수행한다:
getterClosure 를, name 과 env 를 캡처하며, 인자가 없고, 호출 시
다음 단계를 수행하는 새로운 Abstract
Closure 로 둔다:
NormalCompletion (!
env .GetBindingValue(name ,
false ))을 반환한다.
getter 를 CreateBuiltinFunction (getterClosure ,
0, "" , « »)로 둔다.
참고: getter 는 ECMAScript 코드에서 직접 접근할 수 없다.
getter 를 반환한다.
10.4.4.7.2 MakeArgSetter ( name , env )
추상 연산 MakeArgSetter는 name (문자열), env (환경
레코드 )를 인자로 받아, 함수 객체 를 반환한다. 이 연산은 env 에서
name 에 바인딩된 값을 설정하는 내장 함수 객체 를 생성한다. 호출 시 다음 단계를 수행한다:
setterClosure 를, name 과 env 를 캡처하며, (value) 인자를
받고, 호출 시 다음 단계를 수행하는 새로운 Abstract
Closure 로 둔다:
NormalCompletion (!
env .SetMutableBinding(name , value ,
false ))을 반환한다.
setter 를 CreateBuiltinFunction (setterClosure ,
1, "" , « »)로 둔다.
참고: setter 는 ECMAScript 코드에서 직접 접근할 수 없다.
setter 를 반환한다.
10.4.5 TypedArray 익조틱 객체
TypedArray 는
익조틱 객체 로,
프로퍼티 키 중
정규 숫자 문자열 인 것들을 특별하게 처리하며, 그 중 경계
내의 정수
인덱스 에 해당하는 값은 균일 타입의 요소 인덱싱에 사용하고, 나머지는 프로토타입 체인 탐색 없이 존재하지 않는 것으로 강제하는
불변식을 유지합니다.
참고
어떤 Number n 에 대해서도 ToString (n )은 정규 숫자 문자열 이므로, 구현체는 실제로
문자열 변환을 수행하지 않고도 Number를 프로퍼티 키 로 간주하여 TypedArray 에 사용할 수 있습니다.
TypedArray 는
일반
객체 와 동일한 내부 슬롯을 가지며, 추가로 [[ViewedArrayBuffer]] ,
[[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] 내부 슬롯을 가집니다.
객체의 [[PreventExtensions]] , [[GetOwnProperty]] ,
[[HasProperty]] , [[DefineOwnProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 내부 메서드가 이 절의
정의를 따르고, 그 외의 필수 내부 메서드는 10.1 의 정의를
따른다면, 그 객체는 TypedArray 입니다. 이러한 메서드는
TypedArrayCreate 로 설치됩니다.
10.4.5.1 [[PreventExtensions]] ( )
TypedArray
O 의 [[PreventExtensions]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는
정상 완료 를 반환합니다. 호출 시
다음 단계를 수행합니다:
참고: 6.1.7.3 의
확장성 관련 불변식에 따라, O 가 프로퍼티를 얻거나(또는 잃고 다시 얻거나) 할 수 있으면(예: 내부 버퍼가 리사이즈될 때 정수
인덱스 프로퍼티), 이 메서드는 true 를 반환할 수 없습니다.
IsTypedArrayFixedLength (O )
가 false 이면 false 를 반환합니다.
OrdinaryPreventExtensions (O )를
반환합니다.
10.4.5.2 [[GetOwnProperty]] (
P )
TypedArray
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 프로퍼티 디스크립터 또는
undefined 를 포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
value 를 TypedArrayGetElement (O ,
numericIndex )로 둔다.
value 가 undefined 면
undefined 를 반환한다.
PropertyDescriptor { [[Value]] :
value , [[Writable]] :
true , [[Enumerable]] :
true , [[Configurable]] :
true }를 반환한다.
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
10.4.5.3 [[HasProperty]] ( P
)
TypedArray
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 불리언 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면 IsValidIntegerIndex (O ,
numericIndex )를 반환한다.
? OrdinaryHasProperty (O ,
P )를 반환한다.
10.4.5.4 [[DefineOwnProperty]] (
P , Desc )
TypedArray
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 ),
Desc (프로퍼티
디스크립터 )를 인자로 받고, 불리언 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
IsValidIntegerIndex (O ,
numericIndex )가 false 면
false 를 반환한다.
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 이
false 면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 이
false 면 false 를 반환한다.
IsAccessorDescriptor (Desc )가
true 면 false 를 반환한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 이
false 면 false 를 반환한다.
Desc 에 [[Value]] 필드가 있으면,
? TypedArraySetElement (O ,
numericIndex , Desc .[[Value]] )를 수행한다.
true 를 반환한다.
! OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
10.4.5.5 [[Get]] ( P ,
Receiver )
TypedArray
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 ),
Receiver (ECMAScript 언어 값 )를 인자로 받고,
ECMAScript 언어 값 또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
TypedArrayGetElement (O ,
numericIndex )를 반환한다.
? OrdinaryGet (O , P ,
Receiver )를 반환한다.
10.4.5.6 [[Set]] ( P ,
V , Receiver )
TypedArray
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인자로 받고, 불리언
또는 throw completion 을
포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
SameValue (O ,
Receiver )가 true 이면,
? TypedArraySetElement (O ,
numericIndex , V )를 수행한다.
true 를 반환한다.
IsValidIntegerIndex (O ,
numericIndex )가 false 이면
true 를 반환한다.
? OrdinarySet (O , P ,
V , Receiver )를 반환한다.
10.4.5.7 [[Delete]] ( P )
TypedArray
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인자로
받고, 불리언을 포함하는 정상 완료 를 반환한다. 호출 시 다음
단계를 수행한다:
P 가 문자열 이면,
numericIndex 를 CanonicalNumericIndexString (P )로
둔다.
numericIndex 가 undefined 가 아니면,
IsValidIntegerIndex (O ,
numericIndex )가 false 이면
true 를 반환하고, 아니면 false 를 반환한다.
! OrdinaryDelete (O ,
P )를 반환한다.
10.4.5.8 [[OwnPropertyKeys]] ( )
[[OwnPropertyKeys]] 내부 메서드는 TypedArray
O 에 대해 인수를 받지 않으며, 정상 완성 레코드(normal
completion) 에 담긴 리스트(List) 를 반환합니다.
반환되는 리스트는 프로퍼티
키(property keys) 로 구성됩니다. 호출 시 다음 절차를 수행합니다:
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정한다.
keys 를 새로운 비어있는 리스트(List) 로
설정한다.
IsTypedArrayOutOfBounds (taRecord )
가 false 라면,
length 를 TypedArrayLength (taRecord )로
설정한다.
0 ≤ i < length 를 만족하는 정수(integer)
i 각각에 대해, 오름차순으로, 다음을 수행한다:
! ToString (𝔽 (i ))의 결과를
keys 에 추가한다.
O 의 자신의 프로퍼티 키(property key) P 각각에
대해, P 가 문자열(String) 이고
P 가 정수 인덱스(integer index) 가 아닌 경우, 프로퍼티 생성의
시간 순서대로 다음을 수행한다:
P 를 keys 에 추가한다.
O 의 자신의 프로퍼티 키(property key) P 각각에
대해, P 가 심볼(Symbol) 인
경우, 프로퍼티 생성의 시간 순서대로 다음을 수행한다:
P 를 keys 에 추가한다.
keys 를 반환한다.
10.4.5.9 TypedArray With Buffer Witness Records
TypedArray With
Buffer Witness Record 는 레코드(Record) 값으로,
TypedArray 와
함께 버퍼의 바이트 길이 캐시를 캡슐화합니다. 이는
확장 가능한
SharedArrayBuffer 를 볼 때,
바이트 길이 데이터 블록에 대한 단일 공유 메모리 읽기 이벤트가 보장되도록 돕기 위해 사용됩니다.
TypedArray With Buffer Witness Record에는 표 32 에 나열된
필드가 있습니다.
표 32: TypedArray
With Buffer Witness Record 필드
Field Name
Value
Meaning
[[Object]]
TypedArray
바이트 길이가 로드되는 TypedArray .
[[CachedBufferByteLength]]
음수가 아닌 정수(integer) 또는
detached
레코드 가
생성될 때
객체의 [[ViewedArrayBuffer]] 의 바이트 길이.
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord (
obj , order )
추상 연산 MakeTypedArrayWithBufferWitnessRecord는 인수 obj
(TypedArray )
와 order
(seq-cst 또는 unordered )를 받아 TypedArray With Buffer Witness
Record 를 반환합니다. 호출 시 다음 절차를 수행합니다:
buffer 를 obj .[[ViewedArrayBuffer]] 로
설정한다.
IsDetachedBuffer (buffer )
가 true 이면,
byteLength 를 detached 로 설정한다.
그 외의 경우,
byteLength 를 ArrayBufferByteLength (buffer ,
order )의 결과로 설정한다.
TypedArray
With Buffer Witness Record { [[Object]] :
obj , [[CachedBufferByteLength]] :
byteLength } 를 반환한다.
10.4.5.11 TypedArrayCreate ( prototype )
추상 연산 TypedArrayCreate는 prototype (객체)을 인수로 받아 TypedArray 를 반환한다. 이는 새로운 TypedArrays 를 생성하는
방법을 명시하는 데 사용된다. 호출 시 다음 단계를 수행한다:
internalSlotsList 를 « [[Prototype]] , [[Extensible]] , [[ViewedArrayBuffer]] ,
[[TypedArrayName]] , [[ContentType]] ,
[[ByteLength]] ,
[[ByteOffset]] , [[ArrayLength]] »로 한다.
A 를 MakeBasicObject (internalSlotsList )로
한다.
A .[[PreventExtensions]] 를 10.4.5.1 에 명시된 대로
설정한다.
A .[[GetOwnProperty]] 를 10.4.5.2 에 명시된 대로 설정한다.
A .[[HasProperty]] 를 10.4.5.3 에 명시된 대로 설정한다.
A .[[DefineOwnProperty]] 를 10.4.5.4 에 명시된 대로
설정한다.
A .[[Get]] 을 10.4.5.5 에 명시된 대로
설정한다.
A .[[Set]] 을 10.4.5.6 에 명시된 대로
설정한다.
A .[[Delete]] 를 10.4.5.7 에 명시된 대로 설정한다.
A .[[OwnPropertyKeys]] 를 10.4.5.8 에 명시된 대로 설정한다.
A .[[Prototype]] 을 prototype 으로 설정한다.
A 를 반환한다.
10.4.5.12 TypedArrayByteLength ( taRecord )
추상 연산 TypedArrayByteLength는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 0 이상의 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 0을 반환한다.
length 를 TypedArrayLength (taRecord )로
한다.
length = 0이면 0을 반환한다.
O 를 taRecord .[[Object]] 로 한다.
O .[[ByteLength]] 가 auto 가
아니면 O .[[ByteLength]] 를 반환한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
length × elementSize 를 반환한다.
10.4.5.13 TypedArrayLength ( taRecord )
추상 연산 TypedArrayLength는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 0 이상의 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
IsTypedArrayOutOfBounds (taRecord )
는 false 이다.
O 를 taRecord .[[Object]] 로 한다.
O .[[ArrayLength]] 가 auto 가
아니면 O .[[ArrayLength]] 를 반환한다.
Assert :
IsFixedLengthArrayBuffer (O .[[ViewedArrayBuffer]] )는 false 이다.
byteOffset 을 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteLength 를 taRecord .[[CachedBufferByteLength]] 로 한다.
Assert :
byteLength 는 detached 가 아니다.
floor ((byteLength -
byteOffset ) / elementSize )를 반환한다.
10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )
추상 연산 IsTypedArrayOutOfBounds는 taRecord (TypedArray With Buffer Witness
Record )를 인수로 받아 불리언 값을 반환한다. 이 연산은 객체의 수치 프로퍼티가 기본 버퍼의 범위 내에 포함되지 않은
인덱스를 참조하는지 검사한다. 호출 시 다음 단계를 수행한다:
O 를 taRecord .[[Object]] 로 한다.
bufferByteLength 를 taRecord .[[CachedBufferByteLength]] 로 한다.
Assert :
IsDetachedBuffer (O .[[ViewedArrayBuffer]] )는 true 이고 오직
bufferByteLength 가 detached 일 때만 그렇다.
bufferByteLength 가 detached 이면
true 를 반환한다.
byteOffsetStart 를 O .[[ByteOffset]] 로
한다.
O .[[ArrayLength]] 가
auto 이면,
byteOffsetEnd 를 bufferByteLength 로 한다.
그 외의 경우,
elementSize 를 TypedArrayElementSize (O )로
한다.
byteOffsetEnd 를 byteOffsetStart +
O .[[ArrayLength]] ×
elementSize 로 한다.
byteOffsetStart > bufferByteLength 이거나
byteOffsetEnd > bufferByteLength 이면 true 를
반환한다.
참고: 길이가 0인 TypedArrays 는 out-of-bounds로 간주하지 않는다.
false 를 반환한다.
10.4.5.15 IsTypedArrayFixedLength ( O )
추상 연산 IsTypedArrayFixedLength는 O (TypedArray )를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:
O .[[ArrayLength]] 가 auto 이면
false 를 반환한다.
buffer 를 O .[[ViewedArrayBuffer]] 로 한다.
IsFixedLengthArrayBuffer (buffer )
가 false 이고 IsSharedArrayBuffer (buffer )
가 false 이면 false 를 반환한다.
true 를 반환한다.
10.4.5.16 IsValidIntegerIndex ( O , index )
추상 연산 IsValidIntegerIndex는 O (TypedArray )와
index (숫자)를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:
IsDetachedBuffer (O .[[ViewedArrayBuffer]] )가 true 이면
false 를 반환한다.
index 가 정수(Number) 가 아니면
false 를 반환한다.
index 가 -0 𝔽 이거나 index <
-0 𝔽 이면 false 를 반환한다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
unordered )로 한다.
참고: O 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때 bounds 체크는 동기화 연산이 아니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 false 를 반환한다.
length 를 TypedArrayLength (taRecord )로
한다.
ℝ (index )
≥ length 이면 false 를 반환한다.
true 를 반환한다.
10.4.5.17 TypedArrayGetElement ( O , index
)
추상 연산 TypedArrayGetElement는 O (TypedArray )와
index (숫자)를 인수로 받아 숫자(Number), BigInt 또는 undefined 를 반환한다.
호출 시 다음 단계를 수행한다:
IsValidIntegerIndex (O ,
index )가 false 이면 undefined 를 반환한다.
offset 를 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteIndexInBuffer 를 (ℝ (index ) × elementSize ) +
offset 로 한다.
elementType 를 TypedArrayElementType (O )로
한다.
GetValueFromBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer ,
elementType , true , unordered )의
결과를 반환한다.
10.4.5.18 TypedArraySetElement ( O , index ,
value )
추상 연산 TypedArraySetElement는 O (TypedArray ),
index (숫자), value (ECMAScript 언어 값 )을
인수로 받아
normal completion
containing unused 또는 throw completion 을
반환한다. 호출 시 다음 단계를 수행한다:
O .[[ContentType]] 이
bigint 이면, numValue 를 ? ToBigInt (value )로 한다.
그 외에는, numValue 를 ? ToNumber (value )로 한다.
IsValidIntegerIndex (O ,
index )가 true 이면,
offset 을 O .[[ByteOffset]] 로 한다.
elementSize 를 TypedArrayElementSize (O )로
한다.
byteIndexInBuffer 를 (ℝ (index ) ×
elementSize ) + offset 으로 한다.
elementType 을 TypedArrayElementType (O )로
한다.
SetValueInBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer ,
elementType , numValue , true ,
unordered )를 수행한다.
unused 를 반환한다.
참고
이 연산은 항상 성공하는 것처럼 보이지만, TypedArray 의 끝을 넘어 쓰기를 시도하거나
분리(detached)된 ArrayBuffer를 사용하는 TypedArray 에 쓰기를 시도하면 아무 효과가 없다.
10.4.5.19 IsArrayBufferViewOutOfBounds ( O )
추상 연산 IsArrayBufferViewOutOfBounds는 O (TypedArray 또는 DataView)를 인수로 받아 불리언
값을 반환한다. 이 연산은 TypedArray 의 수치 프로퍼티 또는 DataView 객체의 메서드가 기본 데이터
블록의 범위 내에 포함되지 않은 인덱스를 참조할 수 있는지 검사한다. 이 추상 연산은 상위 명세에서 편의를 위해 존재한다. 호출 시 다음 단계를 수행한다:
O 에 [[DataView]] 내부 슬롯이 있으면,
viewRecord 를 MakeDataViewWithBufferWitnessRecord (O ,
seq-cst )로 한다.
IsViewOutOfBounds (viewRecord )의
결과를 반환한다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 한다.
IsTypedArrayOutOfBounds (taRecord )의
결과를 반환한다.
10.4.6 모듈 네임스페이스 이그조틱 객체(Module Namespace Exotic Objects)
모듈 네임스페이스 이그조틱 객체 는
이그조틱 객체 로,
ECMAScript Module 에서 내보낸 바인딩을
노출합니다(자세한 내용은 16.2.3 참조).
모듈 네임스페이스 이그조틱 객체 의 문자열 키를 갖는 자신의
프로퍼티와
Module 이 내보낸 바인딩 이름 사이에는 일대일 대응이
있습니다.
내보낸 바인딩에는 export *로 간접적으로 내보낸 바인딩도 포함됩니다. 각 문자열 값의 자신의
프로퍼티 키 는 해당
내보낸 바인딩 이름의 StringValue 입니다.
이것들은 모듈 네임스페이스 이그조틱 객체 의 유일한 문자열 키
프로퍼티입니다.
각 프로퍼티의 속성은 { [[Writable]] :
true , [[Enumerable]] : true , [[Configurable]] : false }입니다.
모듈 네임스페이스 이그조틱 객체 는 확장할 수 없습니다.
객체의 [[GetPrototypeOf]] , [[SetPrototypeOf]] ,
[[IsExtensible]] , [[PreventExtensions]] , [[GetOwnProperty]] , [[DefineOwnProperty]] , [[HasProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 사용하고,
나머지 필수 내부 메서드는 10.1 의 정의를
사용하는 경우, 그 객체는
모듈 네임스페이스 이그조틱 객체 입니다.
이러한 메서드는 ModuleNamespaceCreate 에 의해 설치됩니다.
모듈 네임스페이스 이그조틱 객체 는
표 33 에 정의된
내부 슬롯을 가집니다.
표 33: 모듈 네임스페이스 이그조틱 객체의 내부 슬롯
10.4.6.1 [[GetPrototypeOf]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[GetPrototypeOf]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 null 을 반환합니다. 호출 시 다음 단계를 수행합니다:
null 을 반환한다.
10.4.6.2 [[SetPrototypeOf]] (
V )
모듈 네임스페이스 이그조틱 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 V (객체 또는
null )를 인수로 받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
! SetImmutablePrototype (O ,
V )의 결과를 반환한다.
10.4.6.3 [[IsExtensible]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[IsExtensible]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 false 를 반환합니다. 호출 시 다음 단계를 수행합니다:
false 를 반환한다.
10.4.6.4 [[PreventExtensions]] ( )
모듈 네임스페이스 이그조틱 객체 의 [[PreventExtensions]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal
completion) 에 담긴 true 를 반환합니다. 호출 시 다음 단계를 수행합니다:
true 를 반환한다.
10.4.6.5 [[GetOwnProperty]] (
P )
모듈 네임스페이스 이그조틱 객체
O 의 [[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 프로퍼티 디스크립터(Property
Descriptor) 또는 undefined 를 반환하거나, throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
OrdinaryGetOwnProperty (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 가 P 를 포함하지 않으면 undefined 를 반환한다.
value 를 ? O .[[Get]] (P ,
O )로 한다.
PropertyDescriptor { [[Value]] : value ,
[[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false }를 반환한다.
10.4.6.6 [[DefineOwnProperty]] (
P , Desc )
모듈 네임스페이스 이그조틱 객체
O 의 [[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키 )와
Desc
(프로퍼티 디스크립터(Property
Descriptor) )를 인수로 받아 정상 완성(normal
completion) 에 담긴 불리언이나 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryDefineOwnProperty (O ,
P , Desc )를 반환한다.
current 를 ? O .[[GetOwnProperty]] (P )로 한다.
current 가 undefined 이면 false 를 반환한다.
Desc 에 [[Configurable]] 필드가 있고
Desc .[[Configurable]] 가
true 이면 false 를 반환한다.
Desc 에 [[Enumerable]] 필드가 있고
Desc .[[Enumerable]] 가 false 이면,
false 를 반환한다.
IsAccessorDescriptor (Desc )
가 true 이면 false 를 반환한다.
Desc 에 [[Writable]] 필드가 있고
Desc .[[Writable]] 가 false 이면,
false 를 반환한다.
Desc 에 [[Value]] 필드가 있으면, SameValue (Desc .[[Value]] , current .[[Value]] )를 반환한다.
true 를 반환한다.
10.4.6.7 [[HasProperty]] ( P
)
모듈 네임스페이스 이그조틱 객체
O 의 [[HasProperty]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryHasProperty (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 에 P 가 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
10.4.6.8 [[Get]] ( P ,
Receiver )
모듈 네임스페이스 이그조틱 객체
O 의 [[Get]] 내부 메서드는 P (프로퍼티 키 )와
Receiver (ECMAScript 언어 값 )를 인수로 받아
정상 완성(normal
completion) 에 담긴 ECMAScript 언어 값
또는 throw completion 을
반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryGet (O ,
P , Receiver )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 가 P 를 포함하지 않으면 undefined 를 반환한다.
m 을 O .[[Module]] 로 한다.
binding 을 m .ResolveExport(P )로 한다.
Assert :
binding 은 ResolvedBinding 레코드 이다.
targetModule 을 binding .[[Module]] 로 한다.
Assert :
targetModule 은 undefined 가 아니다.
binding .[[BindingName]] 이
namespace 이면,
GetModuleNamespace (targetModule )를
반환한다.
targetEnv 를 targetModule .[[Environment]] 로 한다.
targetEnv 가 empty 이면
ReferenceError 예외를 던진다.
? targetEnv .GetBindingValue(binding .[[BindingName]] , true )를 반환한다.
참고
ResolveExport는 부작용이 없습니다. 이 연산이 특정 exportName , resolveSet 쌍을
인수로 받아 호출될 때마다 항상 같은 결과를 반환해야 합니다. 구현체는 각 [[Exports]] 에 대해
ResolveExport 결과를 미리 계산하거나 캐시할 수 있습니다.
10.4.6.9 [[Set]] ( P ,
V , Receiver )
모듈 네임스페이스 이그조틱 객체 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ), V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )를 인수로 받아
정상 완성(normal
completion) 에 담긴 false 를 반환합니다. 호출 시 다음 단계를 수행합니다:
false 를 반환한다.
10.4.6.10 [[Delete]] ( P )
모듈 네임스페이스 이그조틱 객체
O 의 [[Delete]] 내부 메서드는 P (프로퍼티 키 )를 인수로
받아 정상 완성(normal
completion) 에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:
P 가 심볼(Symbol) 이면,
! OrdinaryDelete (O ,
P )를 반환한다.
exports 를 O .[[Exports]] 로 한다.
exports 에 P 가 포함되어 있으면 false 를 반환한다.
true 를 반환한다.
10.4.6.11 [[OwnPropertyKeys]] ( )
모듈 네임스페이스 이그조틱 객체
O 의 [[OwnPropertyKeys]] 내부 메서드는 인수를 받지 않으며, 정상 완성(normal
completion) 에 담긴 프로퍼티 키의 리스트(List) 를
반환합니다. 호출 시 다음 단계를 수행합니다:
exports 를 O .[[Exports]] 로 한다.
symbolKeys 를 OrdinaryOwnPropertyKeys (O )로
한다.
exports 와 symbolKeys 의 리스트
연결(list-concatenation) 결과를 반환한다.
10.4.6.12 ModuleNamespaceCreate ( module ,
exports )
추상 연산 ModuleNamespaceCreate는 module (Module Record )와
exports (문자열의 리스트(List) )를 인수로 받아
module namespace exotic
object 를 반환한다. 이는 새로운 module namespace exotic
objects 의 생성을 명시하는 데 사용된다. 호출 시 다음 절차를 수행한다:
Assert :
module .[[Namespace]] 가
empty 이다.
internalSlotsList 를 표
33 에 나열된 내부 슬롯들로 한다.
M 을 MakeBasicObject (internalSlotsList )로
한다.
M 의 필수 내부 메서드들을 10.4.6 에 명시된 정의로
설정한다.
M .[[Module]] 에 module 을 할당한다.
sortedExports 를 exports 의 요소들을 lexicographic code unit
order 에 따라 정렬한 리스트(List) 로 한다.
M .[[Exports]] 에 sortedExports 를 할당한다.
28.3 에 정의된 대로
M 의 자신의 프로퍼티들을 생성한다.
module .[[Namespace]] 에 M 을 할당한다.
M 을 반환한다.
10.4.7 불변 프로토타입 이그조틱 객체(Immutable Prototype Exotic Objects)
불변 프로토타입 이그조틱 객체 는 이그조틱 객체 이며, 초기화된
후 변경되지 않는 [[Prototype]] 내부 슬롯을 가진다.
객체의 [[SetPrototypeOf]] 내부 메서드가 다음 구현을 사용할 때, 그 객체는 불변 프로토타입 이그조틱 객체 이다. (다른 필수 내부 메서드는 구체적인 불변 프로토타입 이그조틱 객체 에 따라 임의의 구현을
사용할 수 있다.)
참고
다른 이그조틱
객체 와 달리, 불변 프로토타입 이그조틱
객체 에 대해 별도의 생성 추상 연산이 제공되지 않는다. 이는 이 객체들이 %Object.prototype%
및 호스트
환경 에서만 사용되며, 호스트 환경에서는 관련 객체가 다른 방식으로 이그조틱할 수 있으므로 별도의 생성 연산이 필요하기
때문이다.
10.4.7.1 [[SetPrototypeOf]] (
V )
불변 프로토타입 이그조틱 객체
O 의 [[SetPrototypeOf]] 내부 메서드는 인수 V (객체 또는
null )를 받아 정상 완료(normal
completion) 불리언 또는 throw completion 을
반환한다. 호출 시 다음 절차를 수행한다:
? SetImmutablePrototype (O ,
V )를 반환한다.
10.4.7.2 SetImmutablePrototype ( O , V )
추상 연산 SetImmutablePrototype은 O (객체)와 V (객체 또는 null )를
인수로 받아 정상 완료(normal
completion) 불리언 또는 throw completion 을
반환한다. 호출 시 다음 절차를 수행한다:
current 를 ? O .[[GetPrototypeOf]] ()로 한다.
SameValue (V ,
current )가 true 이면 true 를 반환한다.
false 를 반환한다.
10.5 프록시 객체 내부 메서드 및 내부 슬롯
프록시 객체는 익조틱
객체 로, 필수 내부 메서드가 부분적으로 ECMAScript 코드로 구현되어 있습니다. 모든 프록시 객체는 [[ProxyHandler]] 라는 내부 슬롯을 가집니다. [[ProxyHandler]] 의
값은
프록시의 핸들러 객체 라 불리는 객체이거나 null 입니다. 핸들러 객체의 메서드들(표
34 참고)은 하나 이상의 프록시 객체 내부 메서드의 구현을 보강하는 데 사용될 수 있습니다. 모든 프록시 객체는 또한 [[ProxyTarget]] 이라는 내부 슬롯을 가지며, 그 값은 객체이거나 null 입니다. 이 객체를
프록시의 타겟 객체 라고 합니다.
객체가 필수 내부 메서드([[Call]]
및 [[Construct]] 를 포함, 해당되는 경우) 구현에 이 절의 정의를 사용하는 경우, 해당 객체를 프록시 익조틱 객체 라고 합니다.
이러한 내부 메서드는 ProxyCreate 에서 설치됩니다.
표 34: 프록시 핸들러 메서드
내부 메서드
핸들러 메서드
[[GetPrototypeOf]]
getPrototypeOf
[[SetPrototypeOf]]
setPrototypeOf
[[IsExtensible]]
isExtensible
[[PreventExtensions]]
preventExtensions
[[GetOwnProperty]]
getOwnPropertyDescriptor
[[DefineOwnProperty]]
defineProperty
[[HasProperty]]
has
[[Get]]
get
[[Set]]
set
[[Delete]]
deleteProperty
[[OwnPropertyKeys]]
ownKeys
[[Call]]
apply
[[Construct]]
construct
핸들러 메서드가 프록시 객체 내부 메서드의 구현을 제공하기 위해 호출될 때, 핸들러 메서드에는 프록시의 타겟 객체가 인자로 전달됩니다. 프록시의 핸들러 객체는 모든 필수 내부
메서드에 해당하는 메서드를 반드시 가질 필요는 없습니다. 프록시에 대해 내부 메서드를 호출할 때 핸들러 객체에 해당 트랩 메서드가 없으면, 프록시의 타겟 객체의 해당 내부 메서드가
호출됩니다.
프록시 객체의 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯은
객체가 생성될 때 항상 초기화되며 일반적으로 수정할 수 없습니다. 일부 프록시 객체는 이후에 해제(revoke) 될 수 있도록 생성됩니다. 프록시가 해제되면 해당
프록시의 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯이
null 로 설정되어, 이후 해당 프록시 객체의 내부 메서드 호출 시 TypeError 예외가 발생하게 됩니다.
프록시 객체는 내부 메서드의 구현을 임의의 ECMAScript 코드로 제공할 수 있으므로, 핸들러 메서드가 6.1.7.3 에 정의된
불변 조건(invariant)을 위반하는 프록시 객체를 정의하는 것도 가능합니다.
6.1.7.3 에 정의된 일부 내부
메서드 불변 조건은 본질적인 무결성 불변 조건입니다. 이러한 불변 조건은 본 절에 명시된 프록시 객체 내부 메서드에 의해 명시적으로 강제됩니다. ECMAScript 구현체는 모든
가능한 불변 조건 위반에도 견고해야 합니다.
다음 알고리즘 설명에서, O 는 ECMAScript 프록시 객체, P 는 프로퍼티 키 값, V 는 ECMAScript 언어 값 , Desc 는
프로퍼티 디스크립터
레코드라고 가정합니다.
10.5.1 [[GetPrototypeOf]] ( )
프록시 익조틱
객체 O 의 [[GetPrototypeOf]] 내부 메서드는 인자를
받지 않으며, 객체 또는 null 을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"getPrototypeOf" )로 한다.
trap 이 undefined 이면,
? target .[[GetPrototypeOf]] ()를 반환한다.
handlerProto 를 ? Call (trap ,
handler , « target »)로 한다.
handlerProto 가 객체가 아니고 null 도 아니면,
TypeError 예외를 발생시킨다.
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면 handlerProto 를 반환한다.
targetProto 를 ? target .[[GetPrototypeOf]] ()로 한다.
SameValue (handlerProto ,
targetProto )가 false 이면, TypeError 예외를
발생시킨다.
handlerProto 를 반환한다.
참고
프록시 객체의 [[GetPrototypeOf]] 는 다음 불변 조건을 강제합니다:
[[GetPrototypeOf]] 의 결과는 객체 또는 null 이어야
합니다.
타겟 객체가 확장 가능하지 않은 경우, 프록시 객체에 적용된 [[GetPrototypeOf]] 는 타겟
객체에 적용된 [[GetPrototypeOf]] 와 동일한 값을 반환해야 합니다.
10.5.2 [[SetPrototypeOf]] ( V )
프록시 익조틱
객체 O 의 [[SetPrototypeOf]] 내부 메서드는 인자
V (객체 또는 null )를 받고, 불리언을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"setPrototypeOf" )로 한다.
trap 이 undefined 이면,
? target .[[SetPrototypeOf]] (V )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , V »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면 true 를 반환한다.
targetProto 를 ? target .[[GetPrototypeOf]] ()로 한다.
SameValue (V ,
targetProto )가 false 이면 TypeError 예외를
발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[SetPrototypeOf]] 는 다음 불변 조건을 강제합니다:
[[SetPrototypeOf]] 의 결과는 불리언 값이어야
합니다.
타겟 객체가 확장 가능하지 않은 경우, 인자 값은 타겟 객체에 적용된 [[GetPrototypeOf]] 의
결과와 동일해야 합니다.
10.5.3 [[IsExtensible]] ( )
프록시 익조틱
객체 O 의 [[IsExtensible]] 내부 메서드는 인자를 받지
않으며, 불리언을 포함하는 정상 완료 이거나 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"isExtensible" )로 한다.
trap 이 undefined 이면,
? IsExtensible (target )을
반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target »))로 한다.
targetResult 를 ? IsExtensible (target )로 한다.
booleanTrapResult 가 targetResult 와 다르면 TypeError
예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[IsExtensible]] 는 다음 불변 조건을 강제합니다:
[[IsExtensible]] 의 결과는 불리언 값이어야
합니다.
프록시 객체에 적용된 [[IsExtensible]] 는 동일한 인자와 함께 프록시 객체의 타겟 객체에 적용된
[[IsExtensible]] 와 동일한 값을 반환해야 합니다.
10.5.4 [[PreventExtensions]] ( )
프록시 익조틱
객체 O 의 [[PreventExtensions]] 내부 메서드는
인자를 받지 않으며, 불리언을 포함하는 정상 완료 이거나
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"preventExtensions" )로 한다.
trap 이 undefined 이면,
? target .[[PreventExtensions]] () 를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target »))로 한다.
booleanTrapResult 가 true 이면,
extensibleTarget 을 ? IsExtensible (target )로 한다.
extensibleTarget 이 true 이면
TypeError 예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[PreventExtensions]] 는 다음 불변 조건을 강제합니다:
[[PreventExtensions]] 의 결과는 불리언 값이어야
합니다.
프록시 객체에 적용된 [[PreventExtensions]] 는 프록시 객체의 타겟 객체에 적용된 [[IsExtensible]] 가 false 일 때만
true 를 반환합니다.
10.5.5 [[GetOwnProperty]] ( P )
프록시 익조틱
객체 O 의 [[GetOwnProperty]] 내부 메서드는 인자
P (프로퍼티
키 )를 받고,
정상 완료 로 프로퍼티 디스크립터 또는
undefined 을, 혹은 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"getOwnPropertyDescriptor" )로 한다.
trap 이 undefined 이면,
? target .[[GetOwnProperty]] (P )를 반환한다.
trapResultObj 를 ? Call (trap ,
handler , « target , P »)로 한다.
trapResultObj 가 객체가 아니고 undefined 도
아니면, TypeError 예외를 발생시킨다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
trapResultObj 가 undefined 이면,
targetDesc 가 undefined 이면
undefined 를 반환한다.
targetDesc .[[Configurable]] 이
false 이면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
undefined 를 반환한다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
resultDesc 를 ? ToPropertyDescriptor (trapResultObj )로
한다.
CompletePropertyDescriptor (resultDesc )를
수행한다.
valid 를 IsCompatiblePropertyDescriptor (extensibleTarget ,
resultDesc , targetDesc )로 한다.
valid 가 false 이면 TypeError 예외를 발생시킨다.
resultDesc .[[Configurable]] 이
false 이면,
targetDesc 가 undefined 이거나
targetDesc .[[Configurable]] 이
true 이면,
TypeError 예외를 발생시킨다.
resultDesc 가 [[Writable]] 필드를 가지고
resultDesc .[[Writable]] 이
false 이면,
Assert : targetDesc 는
[[Writable]] 필드를 가진다.
targetDesc .[[Writable]] 이
true 이면 TypeError 예외를 발생시킨다.
resultDesc 를 반환한다.
참고
프록시 객체의 [[GetOwnProperty]] 는 다음 불변 조건을 강제합니다:
[[GetOwnProperty]] 의 결과는 객체 또는
undefined 여야 합니다.
타겟 객체에 비구성 가능(Non-configurable) 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
타겟 객체가 확장 불가능(Non-extensible)하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수
없습니다.
타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재하지 않는 경우, 해당 프로퍼티는 존재하는 것으로 보고될 수 없습니다.
타겟 객체에 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 보고할 수 없습니다.
타겟 객체에 비구성 가능, 비쓰기 가능(non-writable) 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 동시에 비구성 가능 및 비쓰기 가능으로
보고할 수 없습니다.
10.5.6 [[DefineOwnProperty]] (
P , Desc )
프록시 익조틱
객체 O 의 [[DefineOwnProperty]] 내부 메서드는
인자 P (프로퍼티
키 )와
Desc (프로퍼티 디스크립터 )를 받아
정상 완료 로 불리언을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"defineProperty" )로 한다.
trap 이 undefined 이면,
? target .[[DefineOwnProperty]] (P ,
Desc )를 반환한다.
descObj 를 FromPropertyDescriptor (Desc )로
한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P , descObj »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
Desc 가 [[Configurable]] 필드를 가지고
Desc .[[Configurable]] 이 false 이면,
settingConfigFalse 를 true 로 한다.
그 외에는,
settingConfigFalse 를 false 로 한다.
targetDesc 가 undefined 이면,
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
settingConfigFalse 가 true 이면
TypeError 예외를 발생시킨다.
그 외에는,
IsCompatiblePropertyDescriptor (extensibleTarget ,
Desc , targetDesc )가 false 이면
TypeError 예외를 발생시킨다.
settingConfigFalse 가 true 이고
targetDesc .[[Configurable]] 이
true 이면 TypeError 예외를 발생시킨다.
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Configurable]] 이 false 이며
targetDesc .[[Writable]] 이
true 이면,
Desc 가 [[Writable]] 필드를 가지고
Desc .[[Writable]] 이
false 이면 TypeError
예외를 발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[DefineOwnProperty]] 는 다음 불변 조건을 강제합니다:
[[DefineOwnProperty]] 의 결과는 불리언 값이어야
합니다.
타겟 객체가 확장 불가능하면 프로퍼티를 추가할 수 없습니다.
타겟 객체에 해당하는 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 만들 수 없습니다.
타겟 객체에 해당하는 비구성 가능, 비쓰기 가능 자체 프로퍼티가 존재하지 않는 한, 비구성 가능 프로퍼티를 비쓰기 가능으로 만들 수 없습니다.
프로퍼티에 해당하는 타겟 객체 프로퍼티가 존재할 때, 그 프로퍼티의 프로퍼티
디스크립터 를 [[DefineOwnProperty]] 로 적용해도
예외가 발생하지 않아야 합니다.
10.5.7 [[HasProperty]] ( P )
프록시 익조틱
객체 O 의 [[HasProperty]] 내부 메서드는 인자
P (프로퍼티
키 )를 받고,
정상 완료 로 불리언을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"has" )로 한다.
trap 이 undefined 이면,
? target .[[HasProperty]] (P )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P »))로 한다.
booleanTrapResult 가 false 이면,
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니면,
targetDesc .[[Configurable]] 이
false 이면 TypeError
예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로
한다.
extensibleTarget 이 false 이면
TypeError 예외를 발생시킨다.
booleanTrapResult 를 반환한다.
참고
프록시 객체의 [[HasProperty]] 는 다음 불변 조건을 강제합니다:
[[HasProperty]] 의 결과는 불리언 값이어야
합니다.
타겟 객체에 비구성 가능 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
10.5.8 [[Get]] ( P ,
Receiver )
프록시 익조틱
객체
O 의 [[Get]] 내부 메서드는 인자 P (프로퍼티 키 )와
Receiver (ECMAScript 언어 값 )를 받고,
정상 완료 로 ECMAScript 언어 값 을,
혹은 예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"get" )로 한다.
trap 이 undefined 이면,
? target .[[Get]] (P , Receiver )를
반환한다.
trapResult 를 ? Call (trap ,
handler , « target , P , Receiver »)로 한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니고
targetDesc .[[Configurable]] 이
false 이면,
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Writable]] 이 false 이면,
SameValue (trapResult ,
targetDesc .[[Value]] )가
false 이면 TypeError
예외를 발생시킨다.
IsAccessorDescriptor (targetDesc )
가 true 이고 targetDesc .[[Get]] 이 undefined 이면,
trapResult 가 undefined 가 아니면
TypeError 예외를 발생시킨다.
trapResult 를 반환한다.
참고
프록시 객체의 [[Get]] 는 다음 불변 조건을 강제합니다:
비쓰기 가능, 비구성 가능 자체 데이터 프로퍼티 의 경우, 해당 프로퍼티에 대해 보고되는 값은 타겟
객체 프로퍼티의 값과 같아야 합니다.
접근자
프로퍼티 이면서 [[Get]] 속성이
undefined 인 비구성 가능 자체 프로퍼티의 경우, 해당 프로퍼티에 대해 보고되는 값은
undefined 여야 합니다.
10.5.9 [[Set]] ( P ,
V , Receiver )
프록시 익조틱
객체
O 의 [[Set]] 내부 메서드는 P (프로퍼티 키 ),
V (ECMAScript 언어 값 ),
Receiver (ECMAScript 언어 값 )을 인자로 받고, 불리언을 포함하는 정상 완료 또는
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"set" )로 한다.
trap 이 undefined 이면,
? target .[[Set]] (P , V ,
Receiver )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P , V , Receiver »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 가 아니고
targetDesc .[[Configurable]] 가
false 이면,
IsDataDescriptor (targetDesc )
가 true 이고 targetDesc .[[Writable]] 이 false 이면,
SameValue (V ,
targetDesc .[[Value]] )가
false 이면 TypeError 예외를 발생시킨다.
IsAccessorDescriptor (targetDesc )
가 true 이면,
targetDesc .[[Set]] 이
undefined 이면 TypeError 예외를 발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[Set]] 는 다음 불변 조건을 강제합니다:
[[Set]] 의 결과는 불리언 값이어야
합니다.
타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 및 비가변(non-writable) 자체 데이터
프로퍼티 인 경우, 해당 프로퍼티의 값을 타겟 객체의 값과 다르게 변경할 수 없습니다.
타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 자체 접근자 프로퍼티 이고, 그 [[Set]] 속성이 undefined 인 경우 해당 프로퍼티 값을 설정할
수 없습니다.
10.5.10 [[Delete]] ( P )
프록시 익조틱
객체 O 의 [[Delete]] 내부 메서드는
P (프로퍼티
키 )를 인자로 받고, 불리언을 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"deleteProperty" )로 한다.
trap 이 undefined 이면,
? target .[[Delete]] (P )를 반환한다.
booleanTrapResult 를 ToBoolean (? Call (trap , handler , «
target , P »))로 한다.
booleanTrapResult 가 false 이면 false 를 반환한다.
targetDesc 를 ? target .[[GetOwnProperty]] (P )로 한다.
targetDesc 가 undefined 이면 true 를 반환한다.
targetDesc .[[Configurable]] 이
false 이면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
extensibleTarget 이 false 이면 TypeError 예외를
발생시킨다.
true 를 반환한다.
참고
프록시 객체의 [[Delete]] 는 다음 불변 조건을 강제합니다:
[[Delete]] 의 결과는 불리언 값입니다.
타겟 객체에 비가변(non-configurable) 자체 프로퍼티로 존재하는 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수 없습니다.
타겟 객체에 자체 프로퍼티로 존재하고, 타겟 객체가 비확장 가능(non-extensible)한 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수
없습니다.
10.5.11 [[OwnPropertyKeys]] ( )
프록시 익조틱
객체 O 의 [[OwnPropertyKeys]] 내부 메서드는 인자를
받지 않으며, 프로퍼티 키들의 List 를 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"ownKeys" )로 한다.
trap 이 undefined 이면,
? target .[[OwnPropertyKeys]] () 를 반환한다.
trapResultArray 를 ? Call (trap ,
handler , « target »))로 한다.
trapResult 를 ? CreateListFromArrayLike (trapResultArray ,
property-key )로 한다.
trapResult 가 중복 항목을 포함하면 TypeError 예외를 발생시킨다.
extensibleTarget 를 ? IsExtensible (target )로 한다.
targetKeys 를 ? target .[[OwnPropertyKeys]] () 로 한다.
Assert :
targetKeys 는 프로퍼티 키들의
List 이다.
Assert :
targetKeys 는 중복 항목을 포함하지 않는다.
targetConfigurableKeys 를 새로운 빈 List 로 한다.
targetNonconfigurableKeys 를 새로운 빈 List 로 한다.
targetKeys 의 각 요소 key 에 대해, 다음을 수행한다:
desc 를 ? target .[[GetOwnProperty]] (key )로 한다.
desc 가 undefined 가 아니고 desc .[[Configurable]] 가 false 이면,
key 를 targetNonconfigurableKeys 에 추가한다.
그 외에는,
key 를 targetConfigurableKeys 에 추가한다.
extensibleTarget 이 true 이고
targetNonconfigurableKeys 가 비어 있으면,
trapResult 를 반환한다.
uncheckedResultKeys 를 trapResult 의 요소들로 이루어진 List 로 한다.
targetNonconfigurableKeys 의 각 요소 key 에 대해, 다음을 수행한다:
uncheckedResultKeys 에 key 가 없으면 TypeError
예외를 발생시킨다.
key 를 uncheckedResultKeys 에서 제거한다.
extensibleTarget 이 true 이면 trapResult 를 반환한다.
targetConfigurableKeys 의 각 요소 key 에 대해, 다음을 수행한다:
uncheckedResultKeys 에 key 가 없으면 TypeError
예외를 발생시킨다.
key 를 uncheckedResultKeys 에서 제거한다.
uncheckedResultKeys 가 비어 있지 않으면 TypeError 예외를 발생시킨다.
trapResult 를 반환한다.
참고
프록시 객체의 [[OwnPropertyKeys]] 는 다음 불변 조건을 강제합니다:
[[OwnPropertyKeys]] 의 결과는 List 입니다.
반환된 List 에는 중복 항목이
없어야 합니다.
반환된 List 의 각 요소는
프로퍼티
키 여야 합니다.
결과 List 에는 타겟 객체의
모든 비가변 자체 프로퍼티의 키가 포함되어야 합니다.
타겟 객체가 비확장 가능(non-extensible)한 경우, 결과 List 에는 타겟 객체의
모든 자체 프로퍼티의 키만 포함되어야 하며, 다른 값은 포함될 수 없습니다.
10.5.12 [[Call]] ( thisArgument ,
argumentsList )
프록시 익조틱
객체
O 의 [[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값 ),
argumentsList (ECMAScript 언어 값들의
List )를 인자로 받고, ECMAScript 언어 값을 포함하는 정상
완료 또는 예외 완료 를
반환합니다. 호출 시 다음 단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"apply" )로 한다.
trap 이 undefined 이면,
? Call (target ,
thisArgument , argumentsList )를 반환한다.
argArray 를 CreateArrayFromList (argumentsList )로
한다.
? Call (trap , handler , «
target , thisArgument , argArray »)를 반환한다.
참고
프록시
익조틱 객체 는 [[ProxyTarget]] 내부 슬롯의 초기 값이
[[Call]] 내부 메서드를 가진 객체인 경우에만 [[Call]]
내부 메서드를 가집니다.
10.5.13 [[Construct]] (
argumentsList , newTarget )
프록시 익조틱
객체 O 의 [[Construct]] 내부 메서드는
argumentsList (ECMAScript 언어 값들의
List ), newTarget (생성자 )를 인자로 받고, 객체를 포함하는 정상 완료 또는
예외 완료 를 반환합니다. 호출 시 다음
단계를 수행합니다:
? ValidateNonRevokedProxy (O )를
수행한다.
target 을 O .[[ProxyTarget]] 로 한다.
Assert :
IsConstructor (target )가
true 임을 확인한다.
handler 를 O .[[ProxyHandler]] 로 한다.
Assert :
handler 는 객체 이다.
trap 을 ? GetMethod (handler ,
"construct" )로 한다.
trap 이 undefined 이면,
? Construct (target ,
argumentsList , newTarget )를 반환한다.
argArray 를 CreateArrayFromList (argumentsList )로
한다.
newObj 를 ? Call (trap , handler , «
target , argArray , newTarget »)로 한다.
newObj 가 객체가 아니면 TypeError 예외를
발생시킨다.
newObj 를 반환한다.
참고 1
프록시
익조틱 객체 는 [[ProxyTarget]] 내부 슬롯의 초기 값이
[[Construct]] 내부 메서드를 가진 객체인 경우에만 [[Construct]] 내부 메서드를 가집니다.
참고 2
프록시 객체의 [[Construct]] 는 다음 불변 조건을 강제합니다:
[[Construct]] 의 결과는 반드시 객체여야 합니다.
10.5.14 ValidateNonRevokedProxy ( proxy )
추상 연산 ValidateNonRevokedProxy는 인자 proxy (프록시 익조틱 객체 )를 받고, unused를 포함하는 정상 완료 또는
예외 완료 를 반환합니다.
proxy 가 해제(revoked)된 경우 TypeError 예외를 발생시킵니다. 호출 시 다음 단계를 수행합니다:
proxy .[[ProxyTarget]] 이 null 이면,
TypeError 예외를 발생시킨다.
Assert :
proxy .[[ProxyHandler]] 는 null 이
아니다.
unused 를 반환한다.
10.5.15 ProxyCreate ( target , handler )
추상 연산 ProxyCreate는 인자 target (ECMAScript 언어 값 )과
handler (ECMAScript 언어 값 )를 받고,
프록시 익조틱 객체를 포함하는 정상 완료
또는 예외 완료 를 반환합니다. 새로운 프록시
객체를 생성할 때 사용됩니다. 호출 시 다음 단계를 수행합니다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
handler 가 객체가 아니면 , TypeError 예외를
발생시킨다.
P 를 MakeBasicObject (« [[ProxyHandler]] , [[ProxyTarget]] »)로 한다.
P 의 필수 내부 메서드들([[Call]] 및 [[Construct]] 제외)에 10.5 에
지정된 정의를 설정한다.
IsCallable (target )이
true 이면,
P .[[Call]] 을 10.5.12 에
명시된 대로 설정한다.
IsConstructor (target )
이 true 이면,
P .[[Construct]] 를
10.5.13 에
명시된 대로 설정한다.
P .[[ProxyTarget]] 을 target 으로 설정한다.
P .[[ProxyHandler]] 를 handler 로 설정한다.
P 를 반환한다.
11 ECMAScript 언어: 소스 텍스트
11.1 소스 텍스트
구문
SourceCharacter ::
임의의 유니코드 코드 포인트
ECMAScript 소스 텍스트 는 유니코드 코드 포인트들의 시퀀스이다. U+0000부터 U+10FFFF까지의 모든 유니코드 코드 포인트
값(서러게이트 코드 포인트 포함)은 ECMAScript 문법에서 허용되는 곳에 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장하고
교환하는 데 사용되는 실제 인코딩은 이 명세와 관련없다. 외부 소스 텍스트 인코딩과 무관하게, 표준 ECMAScript 구현체는 소스 텍스트를 동등한 SourceCharacter 값들의 시퀀스처럼 처리하며, 각
SourceCharacter 는 유니코드 코드 포인트이다.
표준 ECMAScript 구현체는 소스 텍스트의 정규화(normalization)를 수행하거나, 수행하는 것처럼 동작할 필요가 없다.
조합 문자 시퀀스(combining character sequence)의 구성 요소는 사용자가 전체 시퀀스를 하나의 문자로 인식할 수도 있지만, 각각 개별 유니코드 코드 포인트로
취급된다.
참고
문자열 리터럴, 정규 표현식 리터럴, 템플릿 리터럴, 식별자에서는 어떤 유니코드 코드 포인트도 해당 코드 포인트의 숫자 값을 명시적으로 표현하는 유니코드 이스케이프
시퀀스를 사용하여 나타낼 수 있다. 주석 내에서는 이러한 이스케이프 시퀀스가 주석의 일부로 무시된다.
ECMAScript는 유니코드 이스케이프 시퀀스의 동작에서 Java 프로그래밍 언어와 다르다. 예를 들어, Java 프로그램에서 유니코드 이스케이프 시퀀스
\u000A가 한 줄짜리 주석 내에 나타나면, 이는 줄 종결자(유니코드 코드 포인트 U+000A는 LINE FEED (LF))로 해석되어 다음
코드 포인트는 주석의 일부가 아니다. 마찬가지로, Java 프로그램의 문자열 리터럴 내에 \u000A가 나타나면, 이것도 줄 종결자로 해석되어
문자열 리터럴 내에 허용되지 않는다—문자열 리터럴 값에 LINE FEED (LF)를 포함하려면 \n을 사용해야 한다. ECMAScript
프로그램에서는 주석 내에 등장하는 유니코드 이스케이프 시퀀스가 해석되지 않으므로 주석의 종료에 기여할 수 없다. 또한, ECMAScript 프로그램의 문자열 리터럴
내에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴 값에 포함되며, 줄 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.
11.1.1 정적 의미: UTF16EncodeCodePoint ( cp )
추상 연산 UTF16EncodeCodePoint는 인자 cp (유니코드 코드 포인트)를 받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert : 0 ≤
cp ≤ 0x10FFFF.
cp ≤ 0xFFFF이면, 숫자 값이 cp 인 코드 유닛으로 구성된 문자열 값을 반환한다.
cu1 을 (cp - 0x10000) / 0x400의 내림(floor) 값에 0xD800을 더한 값인 코드 유닛으로
한다.
cu2 를 (cp - 0x10000) modulo 0x400의 값에 0xDC00을 더한 값인 코드 유닛으로 한다.
cu1 과 cu2 를 문자열 연결 하여 반환한다.
11.1.2 정적 의미: CodePointsToString ( text )
추상 연산 CodePointsToString은 인자 text (유니코드 코드 포인트 시퀀스)를 받아 문자열을 반환한다. text 를
6.1.4 에 설명된 대로 문자열 값으로
변환한다. 호출 시 다음 단계를 수행한다:
result 를 빈 문자열로 한다.
text 의 각 코드 포인트 cp 에 대해, 다음을 수행한다:
result 를 result 와 UTF16EncodeCodePoint (cp )의
문자열 연결 로 설정한다.
result 를 반환한다.
11.1.3 정적 의미: UTF16SurrogatePairToCodePoint (
lead , trail )
추상 연산 UTF16SurrogatePairToCodePoint는 인자 lead (코드 유닛), trail (코드 유닛)을 받아 코드
포인트를 반환한다. UTF-16 서러게이트 쌍 을 코드 포인트로 변환한다. 호출 시 다음 단계를 수행한다:
Assert :
lead 는 리딩 서러게이트 이고 trail 은 트레일링
서러게이트 이다.
cp 를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) +
0x10000으로 한다.
코드 포인트 cp 를 반환한다.
11.1.4 정적 의미: CodePointAt ( string ,
position )
추상 연산 CodePointAt은 인자 string (문자열), position (음이 아닌 정수 )를 받아, Record 타입의 [[CodePoint]] (코드 포인트), [[CodeUnitCount]] (양의
정수 ), [[IsUnpairedSurrogate]] (불리언) 필드를 가진 결과를 반환한다. string 을
6.1.4 에 설명된 대로 UTF-16
인코딩 코드 포인트 시퀀스로 해석하고, position 위치의 코드 유닛에서 시작하는 코드 포인트 하나를 읽는다. 호출 시 다음 단계를 수행한다:
size 를 string 의 길이로 한다.
Assert :
position ≥ 0이고 position < size 이다.
first 를 string 내 position 인덱스의 코드 유닛으로 한다.
cp 를 first 의 숫자 값과 동일한 숫자 값을 가지는 코드 포인트로 한다.
first 가 리딩 서러게이트 도 아니고 트레일링
서러게이트 도 아니면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] :
false }.
first 가 트레일링 서러게이트 이거나
position + 1 = size 이면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }.
second 를 string 내 position +1 인덱스의 코드 유닛으로 한다.
second 가 트레일링 서러게이트 가 아니면,
다음 Record 를
반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }.
cp 를 UTF16SurrogatePairToCodePoint (first ,
second )로 한다.
다음 Record 를 반환한다: {
[[CodePoint]] : cp , [[CodeUnitCount]] : 2, [[IsUnpairedSurrogate]] : false }.
11.1.5 정적 의미: StringToCodePoints ( string )
추상 연산 StringToCodePoints는 인자 string (문자열)을 받아 코드 포인트들의 List 를 반환한다.
string 을 6.1.4 에 설명된 대로 UTF-16
인코딩 유니코드 텍스트로 해석하여 결과로 유니코드 코드 포인트 시퀀스를 반환한다. 호출 시 다음 단계를 수행한다:
codePoints 를 새로운 빈 List 로 한다.
size 를 string 의 길이로 한다.
position 을 0으로 한다.
position < size 인 동안 반복한다:
cp 를 CodePointAt (string ,
position )으로 한다.
cp .[[CodePoint]] 를 codePoints 에
추가한다.
position 을 position + cp .[[CodeUnitCount]] 로 설정한다.
codePoints 를 반환한다.
11.1.6 정적 의미: ParseText ( sourceText ,
goalSymbol )
추상 연산 ParseText는 인자 sourceText (문자열 또는 유니코드 코드 포인트 시퀀스),
goalSymbol (ECMAScript 문법의 비종결 기호(nonterminal))을 받아, 파스 노드(Parse
Node) 또는 비어 있지 않은 List 의
SyntaxError 객체들을 반환한다. 호출 시 다음 단계를 수행한다:
sourceText 가 문자열 이면,
sourceText 를 StringToCodePoints (sourceText )로
설정한다.
goalSymbol 을 목표 심볼(goal symbol) 로 하여
sourceText 를 파싱하고, 파싱 결과에서 조기 에러(early error) 조건을 분석한다. 파싱과 조기 에러 탐지는
구현 정의 방식으로 상호 교차될 수 있다.
파싱이 성공하고 조기
에러 가 발견되지 않았다면, 파싱으로 얻어진 파스 트리의 루트에서 파스
노드 (goalSymbol 의 인스턴스)를 반환한다.
그렇지 않으면, 파싱 오류 및/또는 조기 에러 를 나타내는 하나 이상의
SyntaxError 객체들의 List 를 반환한다. 둘 이상의
파싱 오류 또는 조기
에러 가 있는 경우, 오류 객체의 개수와 순서는 구현
정의 이지만, 하나 이상은 반드시 포함되어야 한다.
참고 1
특정 위치에 조기
에러 가 있고, 이후 위치에 구문 오류가 있는 텍스트를 생각해보자. 파싱 후 조기 에러 탐지
단계를 수행하는 구현체는 구문 오류만 보고하고 조기 에러 탐지를 진행하지 않을 수도 있다. 두 단계를
교차(interleave)하는 구현체는 조기 에러 만 보고하고 구문 오류를 찾지 않을 수도 있다. 세 번째 구현체는 두
에러 모두를 보고할 수도 있다. 이 모든 동작은 적합하다.
참고 2
11.2 소스 코드의 종류
ECMAScript 코드에는 네 가지 종류가 있다:
글로벌 코드 는 ECMAScript Script 로 취급되는 소스 텍스트이다. 특정 Script 의 글로벌 코드에는 FunctionDeclaration , FunctionExpression , GeneratorDeclaration ,
GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , 또는 ClassExpression 의 일부로 파싱되는 소스
텍스트는 포함되지 않는다.
Eval 코드 는 내장 eval 함수에 전달된 소스 텍스트이다. 더 정확히 말하면, 내장
eval 함수의 인자가 문자열인 경우 ,
이는 ECMAScript Script 로 취급된다.
eval의 특정 호출에 대한 eval 코드는 해당 Script 의 글로벌 코드 부분이다.
함수 코드 란 ECMAScript 함수 객체 의 [[ECMAScriptCode]] 및 [[FormalParameters]]
내부 슬롯(자세한 내용은 10.2 참조)에 값을 제공하기 위해 파싱되는 소스
텍스트이다. 특정 ECMAScript 함수의 함수 코드에는 중첩된 FunctionDeclaration ,
FunctionExpression ,
GeneratorDeclaration , GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration ,
AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction ,
ClassDeclaration , 또는
ClassExpression 의 함수 코드로
파싱되는 소스 텍스트는 포함하지 않는다.
또한, 위에서 언급한 소스 텍스트가 다음과 같이 파싱되는 경우:
그렇다면 해당 선언 또는 표현식의 BindingIdentifier (있을 경우)가 매치하는 소스 텍스트 도
해당 함수의 함수 코드에 포함된다.
모듈 코드 는 ModuleBody 로 제공되는 코드이다. 모듈이 초기화될 때 직접 평가되는 코드이다. 특정
모듈의 모듈 코드에는 중첩된 FunctionDeclaration , FunctionExpression , GeneratorDeclaration ,
GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , 또는 ClassExpression 의 일부로 파싱되는 소스
텍스트는 포함되지 않는다.
참고 1
함수 코드는 일반적으로 함수 정의(15.2 ), 화살표 함수 정의(15.3 ), 메서드 정의(15.4 ), 제너레이터 함수 정의(15.5 ), 비동기 함수 정의(15.8 ), 비동기 제너레이터 함수
정의(15.6 ), 비동기 화살표
함수(15.9 )의 본문으로 제공된다. 함수 코드는
Function 생성자 (20.2.1.1 ),
GeneratorFunction 생성자 (27.3.1.1 ), AsyncFunction
생성자 (27.7.1.1 ),
AsyncGeneratorFunction 생성자 (27.4.1.1 )의 인자에서도
유도된다.
참고 2
함수 코드에 BindingIdentifier 가 포함되는 실질적인 효과는,
엄격 모드
코드(strict mode code) 에 대한 조기 에러(Early Errors)가 "use strict" 지시문이 본문에
포함된 함수의 이름이 되는 BindingIdentifier 에도 적용된다는 것이다. 이때 바깥쪽
코드는 엄격
모드 코드 가 아닐 수 있다.
11.2.1 지시문 프롤로그와 use strict 지시문
지시문 프롤로그 는 ExpressionStatement 들이
StatementListItem 또는
ModuleItem 의 처음에 연속적으로 등장하는 가장 긴
시퀀스로, FunctionBody , ScriptBody , ModuleBody 의 선두에 위치한다. 이 시퀀스의 각
ExpressionStatement 는
오로지 StringLiteral 토큰과 세미콜론으로만
구성되어야 한다. 세미콜론은 명시적으로 존재할 수도 있고, 자동 세미콜론 삽입(12.10 )에 의해 삽입될 수도
있다. 지시문
프롤로그 는 빈 시퀀스일 수도 있다.
use strict
지시문 은 지시문 프롤로그 내의 ExpressionStatement 중에서, StringLiteral 이 정확히
"use strict" 또는 'use strict' 코드 포인트 시퀀스와 일치하는 것이다. use strict
지시문 에는 EscapeSequence 나 LineContinuation 가 포함될 수 없다.
지시문
프롤로그 에는 둘 이상의 use strict 지시문 이 포함될 수 있다. 그러나, 구현체는 이러한 경우
경고를 표시할 수 있다.
참고
지시문
프롤로그 의 ExpressionStatement 들은 포함한 프로덕션이
평가될 때 정상적으로 평가된다. 구현체는 지시문 프롤로그 내에 존재하지만 use
strict 지시문 이 아닌 ExpressionStatement 에 대해 구현 정의의 의미를
부여할 수 있다. 적절한 알림 메커니즘이 존재한다면, 구현체는 지시문 프롤로그 내에서 구현에서 정의된
의미가 없는 use strict 지시문 이 아닌 ExpressionStatement 을 만났을 때 경고를
표시해야 한다.
11.2.2 엄격 모드 코드(Strict Mode Code)
ECMAScript 구문 단위는 제한 없는 모드 또는 엄격 모드 문법 및 의미론(4.3.2 )으로 처리될 수 있다.
다음과 같은 상황에서 코드는 엄격 모드 코드 로 해석된다:
글로벌 코드 가 지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 코드는 엄격 모드 코드이다.
모듈 코드 는 항상 엄격 모드 코드이다.
ClassDeclaration 이나
ClassExpression 의 모든 부분은
엄격 모드 코드이다.
Eval 코드 가 지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 있거나,
eval 호출이 직접 eval(direct
eval) 이고, 해당 호출이 엄격 모드 코드 내에 있을 때, Eval 코드는 엄격 모드 코드이다.
함수 코드 가 연관된 FunctionDeclaration ,
FunctionExpression ,
GeneratorDeclaration , GeneratorExpression ,
AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration ,
AsyncGeneratorExpression , MethodDefinition , ArrowFunction , 또는 AsyncArrowFunction 이 엄격
모드 코드 내에 포함되어 있거나, 함수의 [[ECMAScriptCode]] 내부 슬롯 값이 생성되는 코드는
지시문
프롤로그 로 시작하고, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 함수 코드는 엄격 모드 코드이다.
내장 Function, Generator, AsyncFunction, AsyncGenerator 생성자 에 인자로 제공되는 함수
코드 의 마지막 인자가 문자열 이고, 이를 처리하면
FunctionBody 가 되고, 이
FunctionBody 가 지시문
프롤로그 로 시작하며, 그 안에 use strict 지시문 이 포함되어 있다면,
해당 함수 코드는 엄격 모드 코드이다.
엄격 모드 코드가 아닌 ECMAScript 코드는 비엄격(non-strict) 코드 라고
한다.
11.2.2.1 정적 의미: IsStrict ( node )
추상 연산 IsStrict는 인자 node (파스 노드(Parse Node) )를 받아 불리언을 반환한다. 호출 시
다음 단계를 수행한다:
node가 매칭한 소스
텍스트 가 엄격 모드 코드 이면
true 를 반환하고, 그렇지 않으면 false 를 반환한다.
11.2.3 비-ECMAScript 함수
ECMAScript 구현체는 실행 동작이 호스트
정의 실행 코드 형태로 표현되는 함수 익조틱 객체 의 평가를 지원할 수 있다. 함수 객체 가
ECMAScript 코드 내에서 정의되었는지, 내장 함수인지는 그러한 함수 객체 를 호출하거나, 그에 의해 호출되는 ECMAScript 코드의 관점에서는 관찰할
수 없다.
12 ECMAScript 언어: 렉시컬 문법
ECMAScript Script 또는
Module 의 소스 텍스트는 먼저 입력 요소들의 시퀀스로 변환된다. 입력 요소란
토큰, 줄 종결자, 주석, 또는 공백이다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 가능한 한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 반복적으로 선택한다.
렉시컬 입력 요소의 식별은 입력 요소를 소비하는 구문 문법 컨텍스트에 따라 민감하게 달라지는 여러 상황이 있다. 이는 렉시컬 문법에 여러 목표
심볼 이 필요함을 의미한다. InputElementHashbangOrRegExp 목표는 Script 또는 Module 의 시작 부분에서 사용된다. InputElementRegExpOrTemplateTail 목표는
RegularExpressionLiteral ,
TemplateMiddle , 또는 TemplateTail 이 허용되는 구문 문법 컨텍스트에서 사용된다.
InputElementRegExp 목표
심볼 은 RegularExpressionLiteral 이 허용되지만 TemplateMiddle 또는 TemplateTail 은 허용되지 않는 모든 구문 문법 컨텍스트에서
사용된다. InputElementTemplateTail 목표는 TemplateMiddle 또는 TemplateTail 이 허용되고 RegularExpressionLiteral 은 허용되지
않는 모든 구문 문법 컨텍스트에서 사용된다. 그 외의 모든 컨텍스트에서는 InputElementDiv 가 렉시컬 목표
심볼 로 사용된다.
참고
여러 렉시컬 목표를 사용하는 것은 자동 세미콜론 삽입에 영향을 줄 수 있는 렉시컬 모호성이 없도록 보장한다. 예를 들어, 선행하는 나눗셈 또는 나눗셈 할당과 선행하는
RegularExpressionLiteral 이 모두 허용되는 구문
문법 컨텍스트는 없다. 이것은 세미콜론 삽입(자세한 내용은 12.10 참고)에 영향을 받지
않는다. 예를 들어 다음과 같은 경우:
a = b
/hi/g.exec (c).map (d);
여기서 LineTerminator 뒤의 첫 번째
공백·주석이 아닌 코드 포인트가 U+002F(SOLIDUS)이고, 구문 컨텍스트가 나눗셈 또는 나눗셈 할당을 허용한다면, 해당 LineTerminator 위치에 세미콜론이 삽입되지
않는다. 즉, 위의 예시는 다음과 동일하게 해석된다:
a = b / hi / g.exec (c).map (d);
구문
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
12.1 유니코드 형식 제어 문자
유니코드 형식 제어 문자(즉, 유니코드 문자 데이터베이스에서 “Cf” 범주에 속하는 문자들, 예: LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK)는 상위
수준의 프로토콜(마크업 언어 등)이 없는 경우에 텍스트 범위의 서식을 제어하는 데 사용되는 제어 코드입니다.
편집과 표시를 용이하게 하기 위해 소스 텍스트에 형식 제어 문자를 허용하는 것이 유용합니다. 모든 형식 제어 문자는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 내에서
사용할 수 있습니다.
U+FEFF(ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트의 시작 부분에서 유니코드임을 표시하고 텍스트의 인코딩과 바이트 순서를 감지할 수 있도록 하는 형식 제어
문자입니다.
이러한 목적을 가진 <ZWNBSP> 문자는 파일을 연결(concatenate)하는 등의 작업 결과로 텍스트의 시작 이후에도 나타날 수 있습니다. ECMAScript 소스
텍스트 에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 외부에서는 공백 문자로
취급됩니다(자세한 내용은 12.2 참고).
12.2 공백(White Space)
공백 코드 포인트는 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위)들 사이를 구분하는 데 사용되지만, 그 외에는 의미가 없습니다. 공백 코드 포인트는 어떤 두 토큰
사이에도, 입력의 시작이나 끝에도 올 수 있습니다. 공백 코드 포인트는 StringLiteral ,
RegularExpressionLiteral , Template , TemplateSubstitutionTail 내에도 등장할 수 있으며, 이
경우에는 리터럴 값의 일부를 이루는 의미 있는 코드 포인트로 간주됩니다. 또한 Comment 내에도 등장할 수 있지만, 다른 종류의 토큰 내에는 등장할 수 없습니다.
ECMAScript에서의 공백 코드 포인트는 표 35 에 나열되어 있습니다.
표 35: 공백 코드 포인트
코드 포인트
이름
약어
U+0009
CHARACTER TABULATION
<TAB>
U+000B
LINE TABULATION
<VT>
U+000C
FORM FEED (FF)
<FF>
U+FEFF
ZERO WIDTH NO-BREAK SPACE
<ZWNBSP>
일반 범주 “Space_Separator”의 임의의 코드 포인트
<USP>
참고 1
U+0020(SPACE) 및 U+00A0(NO-BREAK SPACE) 코드 포인트는 <USP>에 포함됩니다.
참고 2
표 35 에 나열된 코드 포인트 외에는,
ECMAScript WhiteSpace 는 유니코드
“White_Space” 속성을 가진 코드 포인트 중 일반 범주 “Space_Separator”(“Zs”)로 분류되지 않은 모든 코드 포인트를 의도적으로 제외합니다.
구문
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
12.3 줄 종결자(Line Terminators)
공백 코드 포인트와 마찬가지로, 줄 종결자 코드 포인트도 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위) 사이를 구분하는 데 사용됩니다. 하지만 공백 코드 포인트와
달리, 줄 종결자는 구문 문법의 동작에 일부 영향을 미칩니다. 일반적으로 줄 종결자는 어떤 두 토큰 사이에도 올 수 있지만, 구문 문법에 의해 금지되는 위치도 일부 있습니다. 줄
종결자는 자동 세미콜론 삽입(12.10 ) 과정에도 영향을 미칩니다. 줄 종결자는
StringLiteral , Template , TemplateSubstitutionTail 토큰 이외의 어떤 토큰 내에도
올 수 없습니다. <LF>와 <CR> 줄 종결자는 StringLiteral 토큰 내에 LineContinuation 의 일부로 나타나는 경우를 제외하고는 올 수 없습니다.
줄 종결자는 MultiLineComment 내에는 올 수
있지만, SingleLineComment 내에는 올
수 없습니다.
줄 종결자는 정규 표현식에서 \s 클래스에 의해 매칭되는 공백 코드 포인트 집합에 포함됩니다.
ECMAScript의 줄 종결자 코드 포인트들은 표 36 에 나열되어 있습니다.
표 36: 줄 종결자 코드 포인트
코드 포인트
유니코드 이름
약어
U+000A
LINE FEED (LF)
<LF>
U+000D
CARRIAGE RETURN (CR)
<CR>
U+2028
LINE SEPARATOR
<LS>
U+2029
PARAGRAPH SEPARATOR
<PS>
표 36 에 있는 유니코드 코드 포인트만 줄 종결자로 취급됩니다.
다른 줄 바꿈 또는 줄 나눔 유니코드 코드 포인트는 줄 종결자로 취급되지 않으며, 표 35 의 조건을 만족하는 경우에만 공백으로
취급됩니다. <CR><LF> 시퀀스는 줄 종결자로 자주 사용됩니다. 이는 줄 번호를 보고(report)할 때 하나의 SourceCharacter 로 간주되어야 합니다.
구문
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence
::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
12.5 해시뱅 주석(Hashbang Comments)
해시뱅 주석은 위치에 민감하며, 다른 주석과 마찬가지로 구문 문법의 입력 요소 스트림에서 버려집니다.
구문
12.6 토큰
구문
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
참고
12.7 이름과 키워드
IdentifierName 과 ReservedWord 는 Unicode Standard Annex
#31, Identifier and Pattern Syntax에 명시된 기본 식별자 문법(Default Identifier Syntax)을 약간 수정하여 해석되는 토큰입니다.
ReservedWord 는 IdentifierName 의 열거된 부분집합입니다. 구문 문법은
Identifier 를 IdentifierName 이면서 ReservedWord 가 아닌 것으로 정의합니다. 유니코드 식별자
문법은 유니코드 표준에 명시된 문자 속성을 기반으로 합니다. 최신 버전의 유니코드 표준에서 지정된 범주의 유니코드 코드 포인트는 모든 호환 ECMAScript 구현체에서 해당
범주로 다뤄져야 합니다. ECMAScript 구현체는 이후 유니코드 표준 버전에 정의된 식별자 코드 포인트도 인식할 수 있습니다.
참고 1
이 표준은 다음의 특정 코드 포인트를 추가로 허용합니다: U+0024(DOLLAR SIGN)와 U+005F(LOW LINE)은 IdentifierName 어디에서든 사용할 수
있습니다.
구문
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar
::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter ::
one of a b c
d e f g h
i j k l m
n o p q r
s t u v w
x y z A B
C D E F G
H I J K L
M N O P Q
R S T U V
W X Y Z
UnicodeIDStart ::
유니코드 속성 “ID_Start”를 가진 임의의 유니코드 코드 포인트
UnicodeIDContinue ::
유니코드 속성 “ID_Continue”를 가진 임의의 유니코드 코드 포인트
비종결 기호 UnicodeEscapeSequence 의 정의는 12.9.4 에 나와 있습니다.
참고 2
참고 3
유니코드 속성 “ID_Start” 및 “ID_Continue”를 가진 코드 포인트 집합에는 각각 “Other_ID_Start” 및 “Other_ID_Continue”
속성을 가진 코드 포인트도 포함됩니다.
12.7.1 식별자 이름
IdentifierName 내에는 유니코드 이스케이프
시퀀스를 사용할 수 있으며, 이 경우 해당 시퀀스는 UnicodeEscapeSequence 의 IdentifierCodePoint 와 동일한 하나의 유니코드 코드 포인트를
기여합니다. UnicodeEscapeSequence 앞의 \는
코드 포인트에 기여하지 않습니다. UnicodeEscapeSequence 는, 그렇지 않으면 유효하지 않은
IdentifierName 에 코드 포인트를 기여하는
데 사용할 수 없습니다. 즉, \ UnicodeEscapeSequence 시퀀스를 해당하는 SourceCharacter 로 대체해도, 결과가 여전히
동일한 IdentifierName 의 정확히 동일한
SourceCharacter 시퀀스가 되어야
합니다. 이 명세 내의 IdentifierName
해석은, 이스케이프 시퀀스가 특정 코드 포인트에 기여했는지 여부와 관계없이 실제 코드 포인트를 기반으로 합니다.
유니코드 표준에 따라 정규적으로 동등한 두 IdentifierName 은, 각 UnicodeEscapeSequence 를 대체한 후에 코드 포인트의
정확히 동일한 시퀀스로 표현되지 않는 한, 동일하지 않습니다 .
12.7.1.1 정적 의미: 조기 에러(Early Errors)
IdentifierStart
::
\
UnicodeEscapeSequence
IdentifierPart ::
\
UnicodeEscapeSequence
12.7.1.2 정적 의미: IdentifierCodePoints
구문-지향 연산
IdentifierCodePoints는 인자를 받지 않으며, 코드 포인트들의 List 를 반환합니다. 다음 생성규칙들에
대해 부분적으로 정의됩니다:
IdentifierName ::
IdentifierStart
cp 를 IdentifierStart 의 IdentifierCodePoint 로 한다.
« cp »를 반환한다.
IdentifierName ::
IdentifierName
IdentifierPart
cps 를 파생된 IdentifierName 의 IdentifierCodePoints 로 한다.
cp 를 IdentifierPart 의 IdentifierCodePoint 로 한다.
cps 와 « cp »의 리스트 연결 을 반환한다.
12.7.1.3 정적 의미: IdentifierCodePoint
구문-지향 연산
IdentifierCodePoint는 인자를 받지 않으며, 코드 포인트를 반환합니다. 다음 생성규칙들에 대해 부분적으로 정의됩니다:
IdentifierStart
:: IdentifierStartChar
IdentifierStartChar 가 매칭한 코드
포인트를 반환한다.
IdentifierPart ::
IdentifierPartChar
IdentifierPartChar 가 매칭한 코드 포인트를
반환한다.
UnicodeEscapeSequence
::
u
Hex4Digits
Hex4Digits 의 MV와 동일한
숫자 값을 가지는 코드 포인트를 반환한다.
UnicodeEscapeSequence
::
u{
CodePoint
}
CodePoint 의 MV와 동일한 숫자
값을 가지는 코드 포인트를 반환한다.
12.7.2 키워드와 예약어
키워드 는 IdentifierName 과 일치하지만, 구문적으로 사용되는 토큰입니다. 즉, 구문
생성규칙에서 고정폭(fixed width) 글꼴로 문자 그대로 등장합니다. ECMAScript의 키워드에는 if,
while, async, await 등 여러 가지가 있습니다.
예약어 는 식별자로 사용할 수 없는 IdentifierName 입니다. 많은 키워드가 예약어이지만, 일부는 아니기도 하며,
일부는 특정 컨텍스트에서만 예약어입니다. if와 while은 예약어입니다. await는 async
함수와 모듈 내에서만 예약어입니다. async는 예약어가 아니며, 변수명이나 statement label로 자유롭게 사용할 수 있습니다.
이 명세는 문법 생성규칙과 조기
에러 규칙의 조합으로 어떤 이름이 유효한 식별자인지, 어떤 이름이 예약어인지 명시합니다. 아래 ReservedWord 목록의 모든 토큰(단,
await와 yield는 제외)은 무조건적으로 예약어입니다. await와
yield의 예외는 13.1 에서 파라미터화된 구문 생성규칙을 통해 명시됩니다. 마지막으로, 여러
조기 에러 규칙이 유효한
식별자의 집합을 제한합니다. 자세한 내용은 13.1.1 , 14.3.1.1 ,
14.7.5.1 ,
15.7.1 참고.
요약하면, 식별자 이름에는 다섯 가지 범주가 있습니다:
항상 식별자로 허용되고 키워드가 아닌 것들(Math, window, toString,
_ 등)
식별자로 절대 허용되지 않는 것들(아래 ReservedWord 목록 중 await와
yield를 제외한 것들)
컨텍스트에 따라 식별자로 허용되는 것들(await와 yield)
엄격
모드 코드 에서 컨텍스트에 따라 식별자로 허용되지 않는 것들: let,
static, implements, interface,
package, private, protected, public
항상 식별자로 허용되지만, 특정 구문 생성규칙 내에서 Identifier 가 허용되지 않는 위치에서 키워드로도 등장하는
것들(as, async, from, get,
meta, of, set, target)
조건부 키워드 또는 컨텍스트 키워드 라는 용어는 마지막 세 범주에 속하는 키워드들을 일컫기도
하며, 이들은 어떤 컨텍스트에서는 식별자로, 어떤 컨텍스트에서는 키워드로 사용될 수 있습니다.
구문
ReservedWord ::
one of await break
case catch class const
continue debugger default
delete do else enum
export extends false finally
for function if import
in instanceof new null
return super switch this
throw true try typeof
var void while with
yield
참고 1
5.1.5 에 따라, 문법의 키워드는 특정 SourceCharacter 시퀀스에 문자
그대로 매칭됩니다. 키워드 내의 코드 포인트는 \ UnicodeEscapeSequence 로 표현될 수
없습니다.
IdentifierName 내에는
\ UnicodeEscapeSequence 를 포함할 수
있지만, els\u{65}와 같이 "else"라는 이름의 변수를 선언할 수는 없습니다. 조기 에러 규칙은
13.1.1 에서
예약어와 StringValue 가 같은 식별자를
금지합니다.
참고 2
enum은 현재 이 명세에서 키워드로 사용되지 않습니다. 이는 미래의 예약어 (future reserved word)로,
향후 언어 확장을 위해 예약되어 있습니다.
마찬가지로 implements, interface, package,
private, protected, public도 엄격 모드
코드 내에서 미래의 예약어입니다.
참고 3
arguments와 eval은 키워드는 아니지만, 엄격 모드
코드 내에서는 일부 제한을 받습니다. 자세한 내용은 13.1.1 ,
8.6.4 ,
15.2.1 ,
15.5.1 ,
15.6.1 ,
15.8.1 를
참고하세요.
12.8 구두점(Punctuators)
구문
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator ::
one of { ( )
[ ] . ... ;
, < > <=
>= == != ===
!== + - * %
** ++ -- <<
>> >>> & |
^ ! ~ &&
|| ?? ? : =
+= -= *= %= **=
<<= >>= >>>=
&= |= ^= &&=
||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator
::
}
12.9 리터럴
12.9.1 Null 리터럴
구문
NullLiteral ::
null
12.9.2 불리언 리터럴
구문
BooleanLiteral ::
true
false
12.9.3 숫자 리터럴
구문
NumericLiteralSeparator
::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep]
::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix
::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral
::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep]
::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit ::
one of 0 1 2
3 4 5 6 7
8 9
NonZeroDigit ::
one of 1 2 3
4 5 6 7 8
9
ExponentPart [Sep]
::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator
:: one of e
E
SignedInteger [Sep]
::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep]
::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep]
::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit ::
one of 0 1
OctalIntegerLiteral [Sep]
::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep]
::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit ::
one of 0 1 2
3 4 5 6
7
NonOctalDigit ::
one of 8 9
HexIntegerLiteral [Sep]
::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep]
::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one
of 0 1 2
3 4 5 6 7
8 9 a b c
d e f A B
C D E F
SourceCharacter 가 NumericLiteral 바로 뒤에 오면 안 되며,
IdentifierStart 또는 DecimalDigit 이면 안 된다.
참고
예를 들어: 3in은 오류이며, 3과 in 두 입력 요소가 아니다.
12.9.3.1 정적 의미: 초기 에러
NumericLiteral ::
LegacyOctalIntegerLiteral
DecimalIntegerLiteral
:: NonOctalDecimalIntegerLiteral
참고
12.9.3.2 정적 의미: MV
숫자 리터럴은 Number 타입 또는
BigInt 타입 의 값을 나타낸다.
12.9.3.3 정적 의미론: NumericValue
구문 지향 연산
NumericValue는 인자를 받지 않으며, Number 또는 BigInt를 반환한다. 다음의 각 생성 규칙에 대해 개별적으로 정의된다:
NumericLiteral ::
DecimalLiteral
DecimalLiteral 의
MV에 RoundMVResult 를 적용한 값을 반환한다.
NumericLiteral ::
NonDecimalIntegerLiteral
NonDecimalIntegerLiteral 의
MV에 𝔽 를 적용한 값을 반환한다.
NumericLiteral ::
LegacyOctalIntegerLiteral
LegacyOctalIntegerLiteral 의
MV에 𝔽 를 적용한 값을 반환한다.
NumericLiteral ::
NonDecimalIntegerLiteral
BigIntLiteralSuffix
NonDecimalIntegerLiteral 의
MV에 대해 BigInt value for 를 반환한다.
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
0 ℤ 을 반환한다.
DecimalBigIntegerLiteral
::
NonZeroDigit
BigIntLiteralSuffix
NonZeroDigit 의 MV에
대해 BigInt value for 를 반환한다.
DecimalBigIntegerLiteral
::
NonZeroDigit
DecimalDigits
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
BigIntLiteralSuffix
n 을 DecimalDigits 내에서 NumericLiteralSeparator 를
제외한 코드 포인트 개수로 한다.
mv 를 (NonZeroDigit 의 MV ×
10n ) + DecimalDigits 의 MV로 한다.
ℤ (mv )를
반환한다.
12.9.4 문자열 리터럴
참고 1
문자열 리터럴은 작은따옴표 또는 큰따옴표로 감싸진 0개 이상의 유니코드 코드 포인트로 구성된다.
유니코드 코드 포인트는 이스케이프 시퀀스로도 표현될 수 있다. 모든 코드 포인트는 문자열 리터럴에 문자 그대로 나타날 수 있지만, 닫는 따옴표 코드 포인트,
U+005C (역슬래시), U+000D (캐리지 리턴), U+000A (줄 바꿈)는 제외된다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다.
문자열 리터럴은 ECMAScript 문자열 값으로 평가된다. 이러한 문자열 값을 생성할 때 유니코드 코드 포인트는 11.1.1 에서 정의된 대로 UTF-16으로 인코딩된다.
Basic Multilingual Plane에 속한 코드 포인트는 문자열의 단일 코드 유닛 요소로 인코딩된다.
그 외의 모든 코드 포인트는 문자열의 두 코드 유닛 요소로 인코딩된다.
구문
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter
::
SourceCharacter
but not one of " or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter
but not one of ' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
:: one of '
" \ b f n
r t v
NonEscapeCharacter
::
SourceCharacter
but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence
::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit
::
OctalDigit but
not 0
ZeroToThree ::
one of 0 1 2
3
FourToSeven ::
one of 4 5 6
7
NonOctalDecimalEscapeSequence
:: one of 8
9
HexEscapeSequence
::
x
HexDigit
HexDigit
UnicodeEscapeSequence
::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
비단말 기호 HexDigit 의 정의는 12.9.3 에 있다. SourceCharacter 는 11.1 에 정의되어
있다.
참고 2
<LF>와 <CR>은 LineContinuation 의 일부로서 빈 코드 포인트 시퀀스를
생성하는 경우를 제외하고 문자열 리터럴에 나타날 수 없다. 문자열 리터럴의 문자열 값에 이를 포함시키는 올바른 방법은 \n 또는
\u000A와 같은 이스케이프 시퀀스를 사용하는 것이다.
12.9.4.1 정적 의미론: 초기 에러
EscapeSequence ::
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
참고 1
비엄격 코드 에서는 이 구문이
Legacy 이다.
참고 2
문자열 리터럴이 Use Strict 지시문 앞에 올 수 있으며, 이 경우
둘러싸는 코드가 엄격 모드 가 된다. 구현체는 이러한 리터럴에 대해 위
규칙을 적용해야 한다. 예를 들어, 다음 소스 텍스트는 구문 에러를 포함한다:
function invalid ( ) { "\7" ; "use strict" ; }
12.9.4.2 정적 의미론: SV
구문 지향 연산
SV는 인자를 받지 않으며, 문자열을 반환한다.
문자열 리터럴은 String 타입 의 값을 의미한다.
SV는 문자열 리터럴의 다양한 부분에 재귀적으로 적용되어 문자열 값을 생성한다. 이 과정의 일부로, 문자열 리터럴 내의 일부 유니코드 코드 포인트는 아래 또는
12.9.3 에서 설명한 대로 수학적
값 을 갖는 것으로 해석된다.
표 37: 문자열 단일 문자 이스케이프 시퀀스
이스케이프 시퀀스
코드 유닛 값
유니코드 문자 이름
기호
\b
0x0008
백스페이스(BACKSPACE)
<BS>
\t
0x0009
문자 탭(CHARACTER TABULATION)
<HT>
\n
0x000A
줄 바꿈(LINE FEED, LF)
<LF>
\v
0x000B
수직 탭(LINE TABULATION)
<VT>
\f
0x000C
폼 피드(FORM FEED, FF)
<FF>
\r
0x000D
캐리지 리턴(CARRIAGE RETURN, CR)
<CR>
\"
0x0022
큰따옴표(QUOTATION MARK)
"
\'
0x0027
작은따옴표(APOSTROPHE)
'
\\
0x005C
역슬래시(REVERSE SOLIDUS)
\
12.9.4.3 정적 의미론: MV
12.9.5 정규 표현식 리터럴
노트 1
정규 표현식 리터럴은 평가될 때마다 RegExp 객체로 변환되는 입력 요소입니다
(22.2 참조). 프로그램 내의 두
정규 표현식 리터럴은,
두 리터럴의 내용이 동일하더라도 서로 ===로 비교될 때 같지 않은 정규 표현식 객체로 평가됩니다. RegExp 객체는
new RegExp 또는 RegExp 생성자 를 함수로 호출하여 런타임에 생성할 수도 있습니다
(22.2.4 참조).
아래의 생성 규칙은 정규 표현식 리터럴의 구문을 설명하며, 입력 요소 스캐너가 정규 표현식 리터럴의 끝을 찾을 때 사용됩니다.
RegularExpressionBody 와 RegularExpressionFlags 를
구성하는 소스 텍스트는
이후 더 엄격한 ECMAScript 정규 표현식 문법을 사용하여 다시 파싱됩니다
(22.2.1 ).
구현체는 22.2.1 에
정의된 ECMAScript 정규 표현식 문법을 확장할 수 있지만,
아래에 정의된 RegularExpressionBody 및 RegularExpressionFlags
생성 규칙
또는 이 생성 규칙들이 사용하는 생성 규칙은 확장할 수 없습니다.
구문
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
단, * 또는 \ 또는 / 또는
[ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
단, \ 또는 / 또는
[ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter
LineTerminator 가 아니어야 함
RegularExpressionClass
::
[
RegularExpressionClassChars
]
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
단, ] 또는 \ 중 하나가 아니어야 함
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
노트 2
정규 표현식 리터럴은 비어 있을 수 없습니다; 빈 정규 표현식 리터럴을 나타내는 대신, 코드 유닛 시퀀스 //는 단일 행 주석을
시작합니다.
빈 정규 표현식을 지정하려면 /(?:)/을 사용하세요.
12.9.5.1 정적 의미론: BodyText
구문 지시 연산
BodyText는 인수를 받지 않으며 소스 텍스트를 반환합니다.
다음 생성 규칙에 대해 개별적으로 정의됩니다:
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody 로 인식된
소스 텍스트를 반환한다.
12.9.5.2 정적 의미론: FlagText
구문 지시 연산
FlagText는 인수를 받지 않으며 소스 텍스트를 반환합니다.
다음 생성 규칙에 대해 개별적으로 정의됩니다:
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionFlags 로 인식된
소스 텍스트를 반환한다.
12.9.6 템플릿 리터럴 렉시컬 구성 요소
구문
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters
::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter
::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter
단, ` 또는 \ 또는 $ 또는
LineTerminator 중
하나가 아니어야 함
TemplateEscapeSequence
::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence
::
0
DecimalDigit
DecimalDigit
단, 0 이 아니어야 함
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
단, HexDigits 의
MV가 0x10FFFF보다 커야 함
CodePoint ::
HexDigits [~Sep]
단, HexDigits 의
MV가 0x10FFFF 이하여야 함
노트
12.9.6.1 정적 의미론: TV
구문 지시 연산
TV는 인수를 받지 않으며 String 또는
undefined 를 반환합니다. 템플릿 리터럴 구성 요소는 TV에 의해
String 타입 값으로
해석됩니다. TV는
템플릿 객체의 인덱스드 구성 요소(일상적으로 템플릿 값)를 구성하는 데 사용됩니다. TV에서 이스케이프 시퀀스는 해당 이스케이프 시퀀스가 나타내는 유니코드 코드
포인트의 UTF-16 코드 유닛(들)로 대체됩니다.
12.9.6.2 정적 의미론: TRV
구문 지시 연산
TRV는 인수를 받지 않으며 String을 반환합니다. 템플릿 리터럴 구성 요소는 TRV에 의해
String 타입 값으로
해석됩니다. TRV는
템플릿 객체의 원시(raw) 구성 요소(일상적으로 템플릿 원시 값)를 구성하는 데 사용됩니다. TRV는 TV 와 유사하지만,
TRV에서는 이스케이프 시퀀스가 리터럴에 나타난 그대로 해석된다는 점이 다릅니다.
NoSubstitutionTemplate
::
`
`
의 TRV는 빈 문자열입니다.
TemplateHead
::
`
${
의 TRV는 빈 문자열입니다.
TemplateMiddle
::
}
${
의 TRV는 빈 문자열입니다.
TemplateTail
::
}
`
의 TRV는 빈 문자열입니다.
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
의 TRV는 TemplateCharacter 의 TRV와
TemplateCharacters 의 TRV를
문자열 연결 한 값입니다.
TemplateCharacter
:: SourceCharacter
단, ` 또는 \ 또는
$ 또는 LineTerminator 중 하나가
아니어야 함
의 TRV는 SourceCharacter 로 매칭된 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
TemplateCharacter
:: $
의 TRV는 코드 유닛 0x0024(DOLLAR SIGN)로 구성된 문자열 값입니다.
TemplateCharacter
::
\
TemplateEscapeSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 TemplateEscapeSequence 의 TRV를
문자열 연결 한 값입니다.
TemplateCharacter
::
\
NotEscapeSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 NotEscapeSequence 의 TRV를
문자열 연결 한 값입니다.
TemplateEscapeSequence
:: 0
의 TRV는 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열 값입니다.
NotEscapeSequence
::
0
DecimalDigit
의 TRV는 코드 유닛 0x0030(DIGIT ZERO)와 DecimalDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
x
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X)로 구성된 문자열 값입니다.
NotEscapeSequence
::
x
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X)와 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)로 구성된 문자열 값입니다.
NotEscapeSequence
::
u
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV, 세 번째 HexDigit 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 코드 유닛 0x007B(LEFT CURLY
BRACKET)을
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET),
NotCodePoint 의 TRV를
문자열 연결 한 값입니다.
NotEscapeSequence
::
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET),
CodePoint 의 TRV를
문자열 연결 한 값입니다.
DecimalDigit
:: one of 0
1 2 3 4
5 6 7 8
9
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
CharacterEscapeSequence
:: NonEscapeCharacter
의 TRV는 NonEscapeCharacter 의
SV
값입니다.
SingleEscapeCharacter
:: one of '
" \ b f
n r t
v
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에
UTF16EncodeCodePoint 를 수행한 결과입니다.
HexEscapeSequence
::
x
HexDigit
HexDigit
의 TRV는 코드 유닛 0x0078(LATIN SMALL LETTER X), 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV를 문자열
연결 한 값이다.
UnicodeEscapeSequence
::
u
Hex4Digits
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U)와 Hex4Digits 의 TRV를 문자열
연결 한 값이다.
UnicodeEscapeSequence
::
u{
CodePoint
}
의 TRV는 코드 유닛 0x0075(LATIN SMALL LETTER U), 코드 유닛 0x007B(LEFT CURLY
BRACKET), CodePoint 의 TRV,
코드 유닛 0x007D(RIGHT CURLY BRACKET)을 문자열 연결 한 값이다.
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
의 TRV는 첫 번째 HexDigit 의 TRV, 두 번째 HexDigit 의 TRV, 세 번째 HexDigit 의 TRV, 네 번째 HexDigit 의 TRV를 문자열
연결 한 값이다.
HexDigits ::
HexDigits
HexDigit
의 TRV는 HexDigits 의 TRV와 HexDigit 의 TRV를 문자열
연결 한 값이다.
HexDigit ::
one of 0 1
2 3 4 5
6 7 8 9
a b c d
e f A B
C D E
F
의 TRV는 이 생성 규칙에 의해 매칭된 단일 코드 포인트에 UTF16EncodeCodePoint 를 수행한 결과이다.
LineContinuation
::
\
LineTerminatorSequence
의 TRV는 코드 유닛 0x005C(REVERSE SOLIDUS)와 LineTerminatorSequence 의 TRV를
문자열 연결 한 값이다.
LineTerminatorSequence
:: <LF>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <CR>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <LS>
의 TRV는 코드 유닛 0x2028(LINE SEPARATOR)로 이루어진 문자열 값이다.
LineTerminatorSequence
:: <PS>
의 TRV는 코드 유닛 0x2029(PARAGRAPH SEPARATOR)로 이루어진 문자열 값이다.
LineTerminatorSequence
::
<CR>
<LF>
의 TRV는 코드 유닛 0x000A(LINE FEED)로 이루어진 문자열 값이다.
노트
TV 는
LineContinuation 의 코드 유닛을 제외하지만,
TRV는 이를 포함합니다. <CR><LF>와 <CR> LineTerminatorSequence 는
TV 와 TRV 모두에서 <LF>로
정규화됩니다.
<CR> 또는 <CR><LF> 시퀀스를 포함하려면
TemplateEscapeSequence 를
명시적으로 사용해야 합니다.
12.10 자동 세미콜론 삽입
대부분의 ECMAScript 문장과 선언은 세미콜론으로 끝나야 합니다. 이러한 세미콜론은 소스 텍스트에 항상 명시적으로 나타낼 수 있습니다. 하지만 편의를 위해, 특정 상황에서는
이러한 세미콜론을 소스 텍스트에서 생략할 수 있습니다. 이러한 상황에서는 세미콜론이 자동으로 소스 코드 토큰 스트림에 삽입된다고 설명합니다.
12.10.1 자동 세미콜론 삽입 규칙
다음 규칙에서 “토큰(token)”은 목표 심볼 로 현재 렉시컬 분석에서 인식된 실제 렉시컬 토큰을 의미하며,
이는 12 절에 설명되어 있습니다.
세미콜론 삽입의 기본 규칙은 세 가지가 있습니다:
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 생산 규칙에도 허용되지 않는 토큰(offending token 이라 함)을 만나면,
다음 조건 중 하나라도 참이면 그 토큰 앞에 세미콜론이 자동으로 삽입됩니다:
offending token이 이전 토큰과 하나 이상의 LineTerminator 로 구분되어 있는 경우.
offending token이 }인 경우.
이전 토큰이 )이고, 삽입된 세미콜론이 do-while 문(14.7.2 )의 종료 세미콜론으로 파싱되는 경우.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 토큰 입력 스트림의 끝에 도달하고 파서가 입력 토큰 스트림을 목표 비단말의 단일 인스턴스로 파싱할 수 없는 경우, 입력
스트림의 끝에 세미콜론이 자동으로 삽입됩니다.
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 토큰이 문법의 어떤 생산 규칙에 의해 허용되지만, 그 생산 규칙이 제한된 생산(restricted
production) 이고 그 토큰이 “[no LineTerminator here]” 주석 바로 다음에 오는 터미널 또는
비단말의 첫 번째 토큰(따라서 restricted token이라 함)이며, 그 restricted token이 이전 토큰과 하나 이상의 LineTerminator 로 구분되어 있다면, 해당
restricted token 앞에 세미콜론이 자동으로 삽입됩니다.
하지만, 앞선 규칙들에 대한 추가적인 우선 조건이 있습니다: 세미콜론이 자동으로 삽입되어 빈 문장(empty statement)이 되거나, for문
헤더의 두 세미콜론 중 하나가 되면, 세미콜론은 절대 자동 삽입되지 않습니다(14.7.4 참조).
노트
다음은 문법에서 유일하게 제한된 생산(restricted production)입니다:
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
++
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
--
ContinueStatement [Yield,
Await] :
continue
;
continue
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
BreakStatement [Yield,
Await] :
break
;
break
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
ReturnStatement [Yield,
Await] :
return
;
return
[no LineTerminator
here]
Expression [+In,
?Yield, ?Await]
;
ThrowStatement [Yield,
Await] :
throw
[no LineTerminator
here]
Expression [+In,
?Yield, ?Await]
;
YieldExpression [In,
Await] :
yield
yield
[no LineTerminator
here]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[no LineTerminator
here]
*
AssignmentExpression [?In,
+Yield, ?Await]
ArrowFunction [In,
Yield, Await] :
ArrowParameters [?Yield,
?Await]
[no LineTerminator
here]
=>
ConciseBody [?In]
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator
here]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[no LineTerminator
here]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[no LineTerminator
here]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator
here]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[no LineTerminator
here]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[no LineTerminator
here]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncArrowFunction [In,
Yield, Await] :
async
[no LineTerminator
here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
AsyncArrowHead
:
async
[no LineTerminator
here]
ArrowFormalParameters [~Yield,
+Await]
이러한 제한된 생산의 실질적 효과는 다음과 같습니다:
++ 또는 -- 토큰이 후위 연산자로 처리되는 위치에서, 그 앞에 하나 이상의 LineTerminator 가 있으면,
++ 또는 -- 앞에 세미콜론이 자동 삽입됩니다.
continue, break, return,
throw, yield 토큰이 등장하고, 그 다음 토큰 앞에 LineTerminator 가 있으면,
해당 토큰 뒤에 세미콜론이 자동 삽입됩니다.
화살표 함수(arrow function) 파라미터 뒤에 LineTerminator 가 오고, 그 뒤에
=> 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.
async 토큰 뒤에 LineTerminator 가 오고, 그 다음에
function 또는 IdentifierName 또는 (
토큰이 오면, 세미콜론이 자동 삽입되고 async는 다음 토큰들과 같은 식이나 클래스 요소의 일부로 처리되지 않습니다.
async 토큰 뒤에 LineTerminator 가 오고, 그 다음에
* 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.
이로 인해 ECMAScript 프로그래머에게 실질적으로 권장되는 사항은 다음과 같습니다:
후위 ++ 또는 -- 연산자는 피연산자와 같은 줄에 있어야 합니다.
Expression 이
return 또는 throw문에 있거나, AssignmentExpression 이
yield 표현식에 있을 때는, 그 시작이 return, throw,
yield 토큰과 같은 줄에 있어야 합니다.
LabelIdentifier 가
break 또는 continue 문에 있을 때는, break 또는
continue 토큰과 같은 줄에 있어야 합니다.
화살표 함수의 파라미터 끝과 =>는 같은 줄에 있어야 합니다.
비동기 함수나 메서드 앞의 async 토큰은 바로 뒤 토큰과 같은 줄에 있어야 합니다.
12.10.2 자동 세미콜론 삽입의 예시
이 절은 규범적인 내용이 아닙니다.
다음 소스는
{ 1 2 } 3
자동 세미콜론 삽입 규칙이 있더라도 ECMAScript 문법에서 유효한 문장이 아닙니다. 반면, 다음 소스
{ 1
2 } 3
도 ECMAScript 문법상 유효한 문장은 아니지만, 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
{ 1
;2 ;} 3 ;
이것은 유효한 ECMAScript 문장입니다.
다음 소스
for (a; b
)
는 유효한 ECMAScript 문장이 아니며, 자동 세미콜론 삽입에 의해 변경되지 않습니다. 그 이유는 for 문 헤더에 필요한 세미콜론이기
때문입니다. 자동 세미콜론 삽입은 for 문 헤더의 두 세미콜론 중 하나를 절대 삽입하지 않습니다.
다음 소스
return
a + b
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
return ;
a + b;
노트 1
a + b 식은 return 문에 의해 반환되는 값으로 처리되지 않습니다. 그 이유는 LineTerminator 가
return 토큰과 그 뒤 토큰 사이에 있기 때문입니다.
다음 소스
a = b
++c
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
a = b;
++c;
노트 2
++ 토큰은 변수 b에 적용되는 후위 연산자로 처리되지 않습니다. 그 이유는 LineTerminator 가
b와 ++ 사이에 있기 때문입니다.
다음 소스
if (a > b)
else c = d
는 유효한 ECMAScript 문장이 아니며, else 토큰 앞에 자동 세미콜론 삽입으로 변경되지 않습니다. 그 이유는 그 경우 자동 삽입된 세미콜론이
빈 문장(empty statement)이 되기 때문입니다.
다음 소스
a = b + c
(d + e).print ()
는 자동 세미콜론 삽입에 의해 변환되지 않습니다 . 그 이유는 두 번째 줄이 괄호로 시작하는 식이기 때문에, 전체가 함수 호출의 인수 목록으로 해석될 수 있기
때문입니다:
a = b + c (d + e).print ()
대입문이 왼쪽 괄호로 시작해야 하는 상황에서는, 자동 세미콜론 삽입에 의존하기보다는 명시적으로 이전 문장의 끝에 세미콜론을 추가하는 것이 좋습니다.
12.10.3 자동 세미콜론 삽입의 흥미로운 사례
이 절은 규범적인 내용이 아닙니다.
ECMAScript 프로그램은 자동 세미콜론 삽입에 의존해 아주 적은 세미콜론만으로 작성될 수도 있습니다. 위에서 설명한 대로, 세미콜론은 모든 줄 바꿈마다 삽입되지 않으며,
자동 세미콜론 삽입은 여러 토큰이 줄 바꿈을 가로지르는지에 따라 달라질 수 있습니다.
ECMAScript에 새로운 문법 기능이 추가됨에 따라, 자동 세미콜론 삽입에 의존하는 라인 앞에서 문법 생산이 달라지는 추가 문법 생산이 추가될 수 있습니다.
이 절에서는, 세미콜론이 삽입될 수도 있고 아닐 수도 있는 위치(즉, 앞선 소스 텍스트에 따라 달라지는 위치)를 자동 세미콜론 삽입의 흥미로운 사례로 간주합니다. 이 절의
나머지 부분에서는 이 버전의 ECMAScript에서 자동 세미콜론 삽입의 여러 흥미로운 사례를 설명합니다.
12.10.3.1 Statement List에서의 자동 세미콜론 삽입의 흥미로운 사례
StatementList 에서, 많은
StatementListItem 은
세미콜론으로 끝나며, 자동 세미콜론 삽입을 통해 생략할 수 있습니다. 위 규칙의 결과로, 표현식이 끝나는 줄의 끝에서 다음 줄이 아래 항목 중 하나로 시작한다면,
세미콜론이 필요합니다:
12.10.3.2 자동 세미콜론 삽입과 “[no
LineTerminator here]” 사례
이 절은 규범적인 내용이 아닙니다.
ECMAScript에는 “[no LineTerminator here]”를 포함하는 문법 생산이 있습니다.
이러한 생산은 때때로 문법에서 피연산자를 선택적으로 허용하기 위한 수단으로 쓰입니다. 이러한 위치에 LineTerminator 를 도입하면, 선택적 피연산자가 없는 문법 생산을
사용하게 되어 문법 생산이 바뀝니다.
이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 “[no LineTerminator here]”를 사용하는 여러 생산을 설명합니다.
12.10.3.2.1 선택적 피연산자와 “[no LineTerminator here]”가 있는 문법 생산 목록
13 ECMAScript 언어: 표현식
13.1 식별자
구문
IdentifierReference [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield,
Await] :
Identifier
yield
await
LabelIdentifier [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName
but not ReservedWord
참고
yield와 await는 문법에서 BindingIdentifier 로 허용되며,
아래 정적 의미 에서 금지되어,
다음과 같은 경우 자동 세미콜론 삽입을 방지한다.
let
await 0 ;
13.1.1 정적 의미: 초기 에러
BindingIdentifier
: Identifier
IdentifierReference
: yield
BindingIdentifier
: yield
LabelIdentifier :
yield
IdentifierReference
: await
BindingIdentifier
: await
LabelIdentifier :
await
BindingIdentifier [Yield,
Await] : yield
이 생성규칙이 [Yield] 매개변수를 가지면 구문 에러이다.
BindingIdentifier [Yield,
Await] : await
이 생성규칙이 [Await] 매개변수를 가지면 구문 에러이다.
IdentifierReference [Yield,
Await] : Identifier
BindingIdentifier [Yield,
Await] : Identifier
LabelIdentifier [Yield,
Await] : Identifier
Identifier : IdentifierName but not
ReservedWord
IsStrict (이
구문)이 true 이고,
IdentifierName 의
StringValue 가
"implements" , "interface" , "let" ,
"package" , "private" , "protected" ,
"public" , "static" , 또는 "yield" 중
하나이면 구문 에러이다.
구문 문법의 목표 기호 가 Module 이고,
IdentifierName 의
StringValue 가
"await" 이면 구문 에러이다.
IdentifierName 의
StringValue 가,
yield 또는 await를 제외한 어떤 ReservedWord 의 StringValue 와
같으면 구문 에러이다.
참고
IdentifierName 의
StringValue 는
IdentifierName 의
모든 유니코드 이스케이프 시퀀스를 정규화하므로,
Identifier 와
ReservedWord 의 코드 포인트
시퀀스가 동일하도록
이스케이프를 사용할 수 없다.
13.1.2 정적 의미: StringValue
구문-지시 연산
StringValue는 인자를 받지 않으며 문자열을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
idTextUnescaped 를 IdentifierName 의 IdentifierCodePoints 로 한다.
CodePointsToString (idTextUnescaped )를
반환한다.
IdentifierReference
: yield
BindingIdentifier
: yield
LabelIdentifier :
yield
"yield" 를 반환한다.
IdentifierReference
: await
BindingIdentifier
: await
LabelIdentifier :
await
"await" 를 반환한다.
Identifier : IdentifierName but not
ReservedWord
IdentifierName 의
StringValue 를 반환한다.
PrivateIdentifier
::
#
IdentifierName
0x0023(샾, #)과 IdentifierName 의 StringValue 를 문자열
결합 하여 반환한다.
ModuleExportName :
StringLiteral
StringLiteral 의
SV 를
반환한다.
13.1.3 런타임 의미: 평가
IdentifierReference
: Identifier
Identifier 의 StringValue 로 ResolveBinding 을(를) 호출한 결과를 반환한다.
IdentifierReference
: yield
ResolveBinding ("yield" )의
결과를 반환한다.
IdentifierReference
: await
ResolveBinding ("await" )의
결과를 반환한다.
참고 1
IdentifierReference 의 평가 결과는 항상
Reference 타입의 값이다.
참고 2
비엄격
코드 에서는, 키워드
yield를 식별자로 사용할 수 있다. IdentifierReference 의 평가 결과는
yield의 바인딩을 Identifier 로서 해석한 것과 같이 된다. 초기 에러 제한은 이러한
평가가 비엄격
코드 에서만 발생할 수 있도록 보장한다.
13.2 기본 표현식
구문
PrimaryExpression [Yield,
Await] :
this
IdentifierReference [?Yield,
?Await]
Literal
ArrayLiteral [?Yield,
?Await]
ObjectLiteral [?Yield,
?Await]
FunctionExpression
ClassExpression [?Yield,
?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield,
?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield,
?Await]
)
(
...
BindingPattern [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingIdentifier [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingPattern [?Yield,
?Await]
)
보조 구문
다음 생성규칙의 인스턴스를 처리할 때
PrimaryExpression [Yield,
Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList 의
해석은 다음 문법을 사용하여 보정된다:
ParenthesizedExpression [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
13.2.1 this 키워드
13.2.1.1 런타임 의미: 평가
PrimaryExpression
: this
? ResolveThisBinding ()를 반환한다.
13.2.2 식별자 참조
IdentifierReference 에
대해서는 13.1 를 참조하라.
13.2.3 리터럴
구문
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
13.2.3.1 런타임 의미: 평가
Literal : NullLiteral
null 을 반환한다.
Literal : BooleanLiteral
BooleanLiteral 이
토큰 false이면 false 를 반환한다.
BooleanLiteral 이
토큰 true이면 true 를 반환한다.
Literal : NumericLiteral
NumericLiteral 의
NumericValue 를 12.9.3 에 정의된 대로 반환한다.
Literal : StringLiteral
StringLiteral 의
SV 를 12.9.4.2 에 정의된 대로 반환한다.
13.2.4 배열 이니셜라이저
참고
ArrayLiteral 은
대괄호로 둘러싸인, 0개 이상의 각 요소가 배열의 원소를 나타내는 표현식으로 이루어진 리스트를 사용하여 배열(Array)의 초기화를 기술하는 표현식이다.
요소들은 반드시 리터럴일 필요는 없으며, 배열 이니셜라이저가 평가될 때마다 각각 평가된다.
배열 요소는 요소 리스트의 시작, 중간, 끝 모두에서 생략될 수 있다. 요소 리스트에서 콤마가 AssignmentExpression 앞에 오지 않는 경우(즉, 시작이거나
또 다른 콤마 뒤), 해당 빠진 배열 요소는 배열의 길이에 기여하며 이후 요소의 인덱스를 증가시킨다. 생략된 배열 요소는 정의되지 않는다. 배열의 끝에 요소가 생략된 경우,
해당 요소는 배열의 길이에 기여하지 않는다.
구문
ArrayLiteral [Yield,
Await] :
[
Elision opt
]
[
ElementList [?Yield,
?Await]
]
[
ElementList [?Yield,
?Await]
,
Elision opt
]
ElementList [Yield,
Await] :
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
Elision opt
SpreadElement [?Yield,
?Await]
ElementList [?Yield,
?Await]
,
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
ElementList [?Yield,
?Await]
,
Elision opt
SpreadElement [?Yield,
?Await]
Elision :
,
Elision
,
SpreadElement [Yield,
Await] :
...
AssignmentExpression [+In,
?Yield, ?Await]
13.2.4.1 런타임 의미: ArrayAccumulation
구문-지시 연산
ArrayAccumulation은 인수 array (배열)와 nextIndex (정수 )를 받아, 정상 완료(normal
completion) 로 정수 를 반환하거나, 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성규칙에 따라 구체적으로 정의된다:
Elision : ,
len 을 nextIndex + 1로 한다.
? Set (array ,
"length" , 𝔽 (len ), true )를
수행한다.
참고: 위 단계에서 len 이 232 - 1을 초과하면 예외가 발생한다.
len 을 반환한다.
Elision :
Elision
,
? ArrayAccumulation 을 Elision 에 대해
array 와 (nextIndex + 1)을 인수로 호출한 결과를 반환한다.
ElementList :
Elision opt
AssignmentExpression
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
initResult 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
initValue 를 ? GetValue (initResult )로 한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
initValue )를 수행한다.
nextIndex + 1을 반환한다.
ElementList :
Elision opt
SpreadElement
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
? ArrayAccumulation 을 SpreadElement 에 대해
array 와 nextIndex 를 인수로 호출한 결과를 반환한다.
ElementList :
ElementList
,
Elision opt
AssignmentExpression
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
initResult 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
initValue 를 ? GetValue (initResult )로 한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
initValue )를 수행한다.
nextIndex + 1을 반환한다.
ElementList :
ElementList
,
Elision opt
SpreadElement
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
Elision 이 존재하면,
nextIndex 를 ? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출한 결과로 설정한다.
? ArrayAccumulation 을 SpreadElement 에 대해
array 와 nextIndex 를 인수로 호출한 결과를 반환한다.
SpreadElement :
...
AssignmentExpression
spreadRef 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
spreadObj 를 ? GetValue (spreadRef )로 한다.
iteratorRecord 를 ? GetIterator (spreadObj ,
sync )로 한다.
반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면 nextIndex 를 반환한다.
! CreateDataPropertyOrThrow (array ,
! ToString (𝔽 (nextIndex )),
next )를 수행한다.
nextIndex 를 nextIndex + 1로 설정한다.
참고
CreateDataPropertyOrThrow 는
표준 내장 Array
프로토타입 객체 가 [[Set]] 을 이용한 새로운 자체 속성 생성을
막는 방식으로 수정된 경우에도, 배열에 자체 속성이 정의되도록 보장하기 위해 사용된다.
13.2.4.2 런타임 의미: 평가
ArrayLiteral :
[
Elision opt
]
array 를 ! ArrayCreate (0)로 한다.
Elision 이 존재하면,
? ArrayAccumulation 을 Elision 에 대해
array 와 0을 인수로 호출하여 수행한다.
array 를 반환한다.
ArrayLiteral :
[
ElementList
]
array 를 ! ArrayCreate (0)로 한다.
? ArrayAccumulation 을 ElementList 에 대해
array 와 0을 인수로 호출하여 수행한다.
array 를 반환한다.
ArrayLiteral :
[
ElementList
,
Elision opt
]
array 를 ! ArrayCreate (0)로 한다.
nextIndex 를 ? ArrayAccumulation 을 ElementList 에 대해
array 와 0을 인수로 호출한 결과로 한다.
Elision 이 존재하면,
? ArrayAccumulation 을 Elision 에 대해
array 와 nextIndex 를 인수로 호출하여 수행한다.
array 를 반환한다.
13.2.5 객체 이니셜라이저
참고 1
객체 이니셜라이저는 객체(Object)의 초기화를 기술하는 표현식으로, 리터럴과 유사한 형태로 작성된다. 중괄호로 감싸진 0개 이상의 프로퍼티 키 와
해당 값의 쌍의 리스트이다. 값은 반드시 리터럴일 필요는 없으며, 객체 이니셜라이저가 평가될 때마다 각각 평가된다.
구문
ObjectLiteral [Yield,
Await] :
{
}
{
PropertyDefinitionList [?Yield,
?Await]
}
{
PropertyDefinitionList [?Yield,
?Await]
,
}
PropertyDefinitionList [Yield,
Await] :
PropertyDefinition [?Yield,
?Await]
PropertyDefinitionList [?Yield,
?Await]
,
PropertyDefinition [?Yield,
?Await]
PropertyDefinition [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
CoverInitializedName [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
AssignmentExpression [+In,
?Yield, ?Await]
MethodDefinition [?Yield,
?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
PropertyName [Yield,
Await] :
LiteralPropertyName
ComputedPropertyName [?Yield,
?Await]
LiteralPropertyName
:
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName [Yield,
Await] :
[
AssignmentExpression [+In,
?Yield, ?Await]
]
CoverInitializedName [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await]
Initializer [In, Yield,
Await] :
=
AssignmentExpression [?In,
?Yield, ?Await]
참고 2
참고 3
특정 맥락에서는 ObjectLiteral 이 더 제한적인 2차 문법을 감싸는 커버 문법으로
사용된다. CoverInitializedName 생성규칙은 이러한 2차
문법을 완전히 커버하기 위해 필요하다. 그러나 이 생성규칙을 사용하는 경우, 실제 ObjectLiteral 이 기대되는 일반적인 맥락에서는 초기 구문 에러가
발생한다.
13.2.5.1 정적 의미: 초기 에러
PropertyDefinition
: MethodDefinition
실제 객체 이니셜라이저를 설명하는 것 이외에도, ObjectLiteral 생성규칙은 ObjectAssignmentPattern 의 커버
문법(cover grammar)으로도 사용될 수 있으며, CoverParenthesizedExpressionAndArrowParameterList 의
일부로 인식될 수 있다. ObjectLiteral 이 ObjectAssignmentPattern 이 요구되는 문맥에
나타나는 경우, 아래 초기 에러 규칙들은 적용되지 않는다 . 또한, CoverParenthesizedExpressionAndArrowParameterList
또는 CoverCallExpressionAndAsyncArrowHead 을
처음 파싱할 때도 적용되지 않는다.
PropertyDefinition
: CoverInitializedName
이 생성규칙에 소스 텍스트가 일치하면 구문 에러이다.
참고 1
이 생성규칙은 ObjectLiteral 이 ObjectAssignmentPattern 의
커버 문법으로 사용될 수 있도록 존재한다. 실제 객체 이니셜라이저에는 등장할 수 없다.
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
참고 2
13.2.5.2 정적 의미: IsComputedPropertyKey
구문-지시 연산
IsComputedPropertyKey는 인수를 받지 않으며 불리언을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyName :
LiteralPropertyName
false 를 반환한다.
PropertyName :
ComputedPropertyName
true 를 반환한다.
13.2.5.3 정적 의미: PropertyNameList
구문-지시 연산
PropertyNameList는 인수를 받지 않으며 문자열의 List 를
반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyDefinitionList
: PropertyDefinition
propName 을 PropertyDefinition 의 PropName 으로 한다.
propName 이 empty 이면, 새로운 빈 List 를 반환한다.
« propName »를 반환한다.
PropertyDefinitionList
:
PropertyDefinitionList
,
PropertyDefinition
list 를 PropertyDefinitionList 의
PropertyNameList 로
한다.
propName 을 PropertyDefinition 의 PropName 로 한다.
propName 이 empty 이면, list 를 반환한다.
list 와 « propName »의 list-concatenation 을
반환한다.
13.2.5.4 런타임 의미: 평가
ObjectLiteral :
{
}
OrdinaryObjectCreate (%Object.prototype% )를
반환한다.
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
PropertyDefinitionList 의
PropertyDefinitionEvaluation 을
obj 를 인수로 하여 호출한다.
obj 를 반환한다.
LiteralPropertyName
: IdentifierName
IdentifierName 의
StringValue 를 반환한다.
LiteralPropertyName
: StringLiteral
StringLiteral 의
SV 를 반환한다.
LiteralPropertyName
: NumericLiteral
nbr 을 NumericLiteral 의 NumericValue 로 한다.
! ToString (nbr )을 반환한다.
ComputedPropertyName
:
[
AssignmentExpression
]
exprValue 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
propName 을 ? GetValue (exprValue )로 한다.
? ToPropertyKey (propName )를 반환한다.
13.2.5.5 런타임 의미: PropertyDefinitionEvaluation
구문-지시 연산
PropertyDefinitionEvaluation은 인수 object (객체)를 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:
PropertyDefinitionList
:
PropertyDefinitionList
,
PropertyDefinition
? PropertyDefinitionEvaluation 을 PropertyDefinitionList 에 대해
object 를 인수로 호출하여 수행한다.
? PropertyDefinitionEvaluation 을 PropertyDefinition 에 대해
object 를 인수로 호출하여 수행한다.
unused 를 반환한다.
PropertyDefinition
:
...
AssignmentExpression
exprValue 를 ? Evaluation 을
AssignmentExpression 에 대해 호출한
결과로 한다.
fromValue 를 ? GetValue (exprValue )로 한다.
excludedNames 를 새로운 빈 List 로 한다.
? CopyDataProperties (object ,
fromValue , excludedNames )를 수행한다.
unused 를 반환한다.
PropertyDefinition
: IdentifierReference
propName 을 IdentifierReference 의 StringValue 로 한다.
exprValue 를 ? Evaluation 을
IdentifierReference 에 대해 호출한
결과로 한다.
propValue 를 ? GetValue (exprValue )로 한다.
Assert :
object 는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
! CreateDataPropertyOrThrow (object ,
propName , propValue )를 수행한다.
unused 를 반환한다.
PropertyDefinition
:
PropertyName
:
AssignmentExpression
propKey 를 ? Evaluation 을
PropertyName 에 대해
호출한 결과로 한다.
이 PropertyDefinition 이 ParseJSON 을 위해 평가 중인 Script 내에 포함되어 있다면,
isProtoSetter 를 false 로 한다.
그렇지 않고, propKey 가 "__proto__" 이고 PropertyName 의
IsComputedPropertyKey 가
false 라면,
isProtoSetter 를 true 로 한다.
그 외의 경우,
isProtoSetter 를 false 로 한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고, isProtoSetter 가 false 라면,
propValue 를 ? NamedEvaluation 을 AssignmentExpression
및 propKey 를 인수로 호출한 결과로 한다.
그 외의 경우,
exprValueRef 를 ? Evaluation 을 AssignmentExpression 에
대해 호출한 결과로 한다.
propValue 를 ? GetValue (exprValueRef )로
한다.
isProtoSetter 가 true 라면,
propValue 가 객체 이거나 propValue 가
null 이라면,
! object .[[SetPrototypeOf]] (propValue )를
수행한다.
unused 를 반환한다.
Assert :
object 는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
! CreateDataPropertyOrThrow (object ,
propKey , propValue )를 수행한다.
unused 를 반환한다.
PropertyDefinition
: MethodDefinition
? MethodDefinitionEvaluation 을 MethodDefinition 에
대해 object 와 true 를 인수로 호출하여 수행한다.
unused 를 반환한다.
13.2.6 함수 정의 표현식
15.2 에서
PrimaryExpression
: FunctionExpression
를 참조하라.
15.5 에서
PrimaryExpression
: GeneratorExpression
를 참조하라.
15.7 에서
PrimaryExpression
: ClassExpression
를 참조하라.
15.8 에서
PrimaryExpression
: AsyncFunctionExpression
를 참조하라.
15.6 에서
PrimaryExpression
: AsyncGeneratorExpression
를 참조하라.
13.2.7 정규 표현식 리터럴
구문
12.9.5 를 참조하라.
13.2.7.1 정적 의미: 초기 에러
PrimaryExpression
: RegularExpressionLiteral
13.2.7.2 정적 의미: IsValidRegularExpressionLiteral (
literal )
추상 연산 IsValidRegularExpressionLiteral은 인수 literal (RegularExpressionLiteral
파스
노드 )를 받고 불리언을 반환한다. 이 연산은 인수가 유효한 정규 표현식 리터럴인지 판단한다. 호출 시 다음 단계를 수행한다:
flags 를 literal 의 FlagText 로 한다.
flags 에 d, g, i, m,
s, u, v, y 이외의 코드 포인트가 포함되어 있거나,
flags 에 동일한 코드 포인트가 두 번 이상 포함되어 있으면 false 를 반환한다.
flags 에 u가 포함되어 있으면 u 를 true 로,
아니면 false 로 한다.
flags 에 v가 포함되어 있으면 v 를 true 로,
아니면 false 로 한다.
patternText 를 literal 의 BodyText 로
한다.
u 가 false 이고 v 가 false 이면,
stringValue 를 CodePointsToString (patternText )로
한다.
patternText 를 stringValue 의 각 16비트 요소를 유니코드 BMP 코드 포인트로
해석하여 얻은 코드 포인트 시퀀스로 설정한다. UTF-16 디코딩은 적용하지 않는다.
parseResult 를 ParsePattern (patternText ,
u , v )로 한다.
parseResult 가 파스 노드 라면
true 를, 그렇지 않으면 false 를 반환한다.
13.2.7.3 런타임 의미: 평가
PrimaryExpression
: RegularExpressionLiteral
pattern 을 CodePointsToString (BodyText of RegularExpressionLiteral )로
한다.
flags 를 CodePointsToString (FlagText of RegularExpressionLiteral )로
한다.
! RegExpCreate (pattern ,
flags )를 반환한다.
13.2.8 템플릿 리터럴
구문
TemplateLiteral [Yield, Await,
Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield,
?Await, ?Tagged]
TemplateSpans [Yield, Await,
Tagged] :
TemplateTail
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateTail
TemplateMiddleList [Yield,
Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
13.2.8.1 정적 의미론: 초기 에러
TemplateLiteral [Yield,
Await, Tagged] :
NoSubstitutionTemplate
TemplateLiteral [Yield,
Await, Tagged] :
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield,
?Await, ?Tagged]
TemplateSpans [Yield, Await,
Tagged] : TemplateTail
TemplateMiddleList [Yield,
Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
13.2.8.2 정적 의미론: TemplateStrings
구문 지향 연산
TemplateStrings는 raw (불리언)를 인수로 받고, 문자열 또는 undefined 의
리스트 를 반환한다. 이는 다음 생산식들에
대해 부분적으로 정의된다:
TemplateLiteral
: NoSubstitutionTemplate
« TemplateString (NoSubstitutionTemplate ,
raw ) »를 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
head 를 « TemplateString (TemplateHead ,
raw ) »로 한다.
tail 을 TemplateStrings
of TemplateSpans
with argument raw 로 한다.
head 와 tail 의 리스트 결합 을 반환한다.
TemplateSpans :
TemplateTail
« TemplateString (TemplateTail ,
raw ) »를 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
middle 을 TemplateStrings
of TemplateMiddleList with
argument raw 로 한다.
tail 을 « TemplateString (TemplateTail ,
raw ) »로 한다.
middle 와 tail 의 리스트 결합 을 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
« TemplateString (TemplateMiddle ,
raw ) »를 반환한다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
front 를 TemplateStrings
of TemplateMiddleList with
argument raw 로 한다.
last 를 « TemplateString (TemplateMiddle ,
raw ) »로 한다.
front 와 last 의 리스트 결합 을 반환한다.
13.2.8.3 정적 의미론: TemplateString (
templateToken , raw )
추상 연산 TemplateString은 templateToken (NoSubstitutionTemplate 파스
노드 , TemplateHead 파스
노드 , TemplateMiddle 파스
노드 , 또는 TemplateTail 파스
노드 )와 raw (불리언)를 인수로 받고, 문자열 또는
undefined 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 raw 가 true 이면,
string 을 TRV of
templateToken 으로 한다.
그 외에는,
string 을 TV of
templateToken 으로 한다.
string 을 반환한다.
참고
이 연산은 raw 가 false 이고 templateToken 에 NotEscapeSequence 가 포함된 경우
undefined 를 반환한다. 그 외의 경우에는 문자열을 반환한다.
13.2.8.4 GetTemplateObject ( templateLiteral )
추상 연산 GetTemplateObject는 templateLiteral (파스 노드 )를 인수로 받고, 배열을 반환한다.
호출 시 다음 단계를 수행한다:
realm 을 현재 Realm Record 로 한다.
templateRegistry 를 realm .[[TemplateMap]] 으로 한다.
templateRegistry 의 각 요소 e 에 대해,
만약 e .[[Site]] 가 동일한 파스 노드 인
templateLiteral 과 같다면,
e .[[Array]] 를 반환한다.
rawStrings 를 TemplateStrings
of templateLiteral with argument true 로 한다.
Assert :
rawStrings 는 문자열
리스트 이다.
cookedStrings 를 TemplateStrings
of templateLiteral with argument false 로 한다.
count 를 리스트
cookedStrings 의 요소 개수로 한다.
Assert :
count ≤ 232 - 1.
template 을 ! ArrayCreate (count )로 한다.
rawObj 를 ! ArrayCreate (count )로 한다.
index 를 0으로 한다.
index < count 동안 반복,
prop 을 ! ToString (𝔽 (index ))로 한다.
cookedValue 를 cookedStrings [index ]로 한다.
! DefinePropertyOrThrow (template ,
prop , PropertyDescriptor { [[Value]] :
cookedValue , [[Writable]] :
false , [[Enumerable]] :
true , [[Configurable]] :
false })를 수행한다.
rawValue 를 rawStrings [index ]로 한다.
! DefinePropertyOrThrow (rawObj ,
prop , PropertyDescriptor { [[Value]] :
rawValue , [[Writable]] :
false , [[Enumerable]] :
true , [[Configurable]] :
false })를 수행한다.
index 를 index + 1로 한다.
! SetIntegrityLevel (rawObj ,
frozen )을 수행한다.
! DefinePropertyOrThrow (template ,
"raw" , PropertyDescriptor { [[Value]] :
rawObj , [[Writable]] : false ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! SetIntegrityLevel (template ,
frozen )을 수행한다.
Record { [[Site]] : templateLiteral , [[Array]] : template }를
realm .[[TemplateMap]] 에 추가한다.
template 을 반환한다.
참고 1
템플릿 객체의 생성은 비정상
완료 를 일으킬 수 없다.
참고 2
realm 의 프로그램
코드에 있는 각 TemplateLiteral 는 태그드 템플릿 평가에 사용되는
고유한 템플릿 객체와 연결되어 있다 (13.2.8.6 ).
템플릿 객체는 frozen 상태이며, 특정 태그드 템플릿이 평가될 때마다 동일한 템플릿 객체가 사용된다. 템플릿 객체가 TemplateLiteral 의 첫
평가 시점에 지연 생성(lazy)되는지 혹은 사전에 미리 생성되는지는 구현 선택 사항이며, ECMAScript 코드에서는 관찰할 수 없다.
참고 3
이 명세의 미래 버전에서는 템플릿 객체의 추가적인 non-enumerable 프로퍼티가 정의될 수 있다.
13.2.8.5 런타임 의미론: SubstitutionEvaluation
구문 지향 연산
SubstitutionEvaluation은 인수를 받지 않으며, 리스트 나
비정상 완료 를 반환한다. 다음
생산식들에 대해 정의된다:
TemplateSpans :
TemplateTail
새로운 빈 리스트 를 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
? SubstitutionEvaluation of TemplateMiddleList 의 결과를 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
« sub »를 반환한다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
preceding 을 ? SubstitutionEvaluation of TemplateMiddleList 의 결과로 한다.
nextRef 를 ? Evaluation of
Expression 의 결과로 한다.
next 를 ? GetValue (nextRef )로 한다.
preceding 과 « next »의 리스트 결합 을 반환한다.
13.2.8.6 런타임 의미론: 평가
TemplateLiteral
: NoSubstitutionTemplate
TV of NoSubstitutionTemplate 를
12.9.6 에 정의된
대로 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
head 를 TV of TemplateHead 로 하고,
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
middle 을 ? ToString (sub )로 한다.
tail 을 ? Evaluation of
TemplateSpans 의
결과로 한다.
head , middle , tail 의 문자열
결합 을 반환한다.
참고 1
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
TemplateSpans :
TemplateTail
TV of TemplateTail 를
12.9.6 에 정의된
대로 반환한다.
TemplateSpans :
TemplateMiddleList
TemplateTail
head 를 ? Evaluation of
TemplateMiddleList 의 결과로 한다.
tail 을 TV of TemplateTail 를
12.9.6 에 정의된
대로 한다.
head 와 tail 의 문자열 결합 을 반환한다.
TemplateMiddleList
:
TemplateMiddle
Expression
head 를 TV of TemplateMiddle 를
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
middle 을 ? ToString (sub )로 한다.
head 와 middle 의 문자열 결합 을 반환한다.
참고 2
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
TemplateMiddleList
:
TemplateMiddleList
TemplateMiddle
Expression
rest 를 ? Evaluation of
TemplateMiddleList 의 결과로 한다.
middle 을 TV of TemplateMiddle 를
12.9.6 에 정의된
대로 한다.
subRef 를 ? Evaluation of
Expression 의 결과로 한다.
sub 를 ? GetValue (subRef )로 한다.
last 를 ? ToString (sub )로 한다.
rest , middle , last 의 문자열
결합 을 반환한다.
참고 3
Expression 값에 적용되는
문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.
13.2.9 그룹화 연산자
13.2.9.1 정적 의미론: 초기 에러
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
13.2.9.2 런타임 의미론: 평가
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 를 ParenthesizedExpression 로
한다. 이는 포함된 CoverParenthesizedExpressionAndArrowParameterList 이다.
? Evaluation of expr 를 반환한다.
ParenthesizedExpression
:
(
Expression
)
? Evaluation of Expression 을 반환한다. 이 값은 Reference 타입일 수
있다.
참고
이 알고리즘은 Evaluation of Expression 의 결과에
GetValue 를 적용하지 않는다. 그 주요 동기는
delete 및 typeof와 같은 연산자가 괄호로 묶인 표현식에 적용될 수 있도록 하기 위함이다.
13.3 좌변식(Left-Hand-Side Expressions)
구문
MemberExpression [Yield,
Await] :
PrimaryExpression [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
MemberExpression [?Yield,
?Await]
.
IdentifierName
MemberExpression [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
SuperProperty [?Yield,
?Await]
MetaProperty
new
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperProperty [Yield,
Await] :
super
[
Expression [+In, ?Yield,
?Await]
]
super
.
IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new
.
target
ImportMeta :
import
.
meta
NewExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
new
NewExpression [?Yield,
?Await]
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
SuperCall [?Yield,
?Await]
ImportCall [?Yield,
?Await]
CallExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
CallExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
CallExpression [?Yield,
?Await]
.
IdentifierName
CallExpression [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
CallExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperCall [Yield,
Await] :
super
Arguments [?Yield,
?Await]
ImportCall [Yield,
Await] :
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
Arguments [Yield,
Await] :
(
)
(
ArgumentList [?Yield,
?Await]
)
(
ArgumentList [?Yield,
?Await]
,
)
ArgumentList [Yield,
Await] :
AssignmentExpression [+In,
?Yield, ?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
...
AssignmentExpression [+In,
?Yield, ?Await]
OptionalExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalChain [Yield,
Await] :
?.
Arguments [?Yield,
?Await]
?.
[
Expression [+In, ?Yield,
?Await]
]
?.
IdentifierName
?.
TemplateLiteral [?Yield,
?Await, +Tagged]
?.
PrivateIdentifier
OptionalChain [?Yield,
?Await]
Arguments [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
OptionalChain [?Yield,
?Await]
.
IdentifierName
OptionalChain [?Yield,
?Await]
TemplateLiteral [?Yield,
?Await, +Tagged]
OptionalChain [?Yield,
?Await]
.
PrivateIdentifier
LeftHandSideExpression [Yield,
Await] :
NewExpression [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
보충 구문
다음 생성식을 처리할 때
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead 의
해석은 다음 문법을 사용하여 보완된다:
CallMemberExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
13.3.1 정적 의미론
13.3.1.1 정적 의미론: 초기 에러
OptionalChain :
?.
TemplateLiteral
OptionalChain
TemplateLiteral
이 생성식에 의해 소스 텍스트가 일치하는 경우 구문 오류이다.
참고
이 생성식은 다음 코드에 자동 세미콜론 삽입 규칙(12.10 )이 적용되는 것을
방지하기 위해 존재한다:
a?.b
`c`
이 코드는 두 개의 유효한 문장으로 해석되어야 한다. 목적은 선택적 체이닝 없이 유사한 코드와 일관성을 유지하는 것이다:
a.b
`c`
이 코드는 유효한 문장이며, 자동 세미콜론 삽입이 적용되지 않는다.
ImportMeta :
import
.
meta
13.3.2 프로퍼티 접근자
참고
프로퍼티는 점 표기법(dot notation)을 사용하여 이름으로 접근할 수 있다:
또는 대괄호 표기법(bracket notation)을 사용할 수 있다:
점 표기법은 다음 구문 변환에 의해 설명된다:
이는 동작상 다음과 동일하다:
그리고 마찬가지로
이는 동작상 다음과 동일하다:
여기서 <identifier-name-string >은 IdentifierName 의 StringValue 이다.
13.3.2.1 런타임 의미론: 평가
MemberExpression
:
MemberExpression
[
Expression
]
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this MemberExpression )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )를 반환한다.
MemberExpression
:
MemberExpression
.
IdentifierName
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this MemberExpression )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )를 반환한다.
MemberExpression
:
MemberExpression
.
PrivateIdentifier
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )를 반환한다.
CallExpression :
CallExpression
[
Expression
]
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this CallExpression )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )를 반환한다.
CallExpression :
CallExpression
.
IdentifierName
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
strict 를 IsStrict (this CallExpression )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )를 반환한다.
CallExpression :
CallExpression
.
PrivateIdentifier
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )를 반환한다.
13.3.3 EvaluatePropertyAccessWithExpressionKey (
baseValue , expression , strict )
추상 연산 EvaluatePropertyAccessWithExpressionKey는 baseValue (ECMAScript 언어 값 ),
expression (Expression 파스 노드 ), strict
(불리언)를 인수로 받고, 정상 완료(normal
completion) 가 담긴 Reference
Record 또는 비정상 완료(abrupt
completion) 를 반환한다. 실행 시 다음 단계를 수행한다:
propertyNameReference 를 ? Evaluation of
expression 의 결과로 한다.
propertyNameValue 를 ? GetValue (propertyNameReference )로
한다.
참고: 대부분의 경우 ToPropertyKey 가 이 단계 바로 뒤에
propertyNameValue 에 적용된다. 하지만 a[b] = c의 경우 c의 평가가 끝난
뒤에 적용된다.
Reference Record
{ [[Base]] : baseValue , [[ReferencedName]] : propertyNameValue , [[Strict]] : strict , [[ThisValue]] : empty }를 반환한다.
13.3.4 EvaluatePropertyAccessWithIdentifierKey (
baseValue , identifierName , strict )
추상 연산 EvaluatePropertyAccessWithIdentifierKey는 baseValue (ECMAScript 언어 값 ),
identifierName (IdentifierName 파스
노드 ), strict (불리언)를 인수로 받고, Reference Record 를 반환한다.
실행 시 다음 단계를 수행한다:
propertyNameString 을 StringValue of
identifierName 로 한다.
Reference Record
{ [[Base]] : baseValue , [[ReferencedName]] : propertyNameString , [[Strict]] : strict , [[ThisValue]] : empty }를 반환한다.
13.3.5 new 연산자
13.3.5.1 런타임 의미론: 평가
NewExpression :
new
NewExpression
? EvaluateNew (NewExpression ,
empty )를 반환한다.
MemberExpression
:
new
MemberExpression
Arguments
? EvaluateNew (MemberExpression , Arguments )를 반환한다.
13.3.5.1.1 EvaluateNew ( constructExpr ,
arguments )
추상 연산 EvaluateNew는 constructExpr (NewExpression 파스
노드 또는 MemberExpression 파스
노드 )와 arguments (empty 또는
Arguments 파스
노드 )를 인수로 받고, 정상 완료(normal
completion) 가 담긴 ECMAScript 언어
값 또는 비정상 완료(abrupt
completion) 를 반환한다. 실행 시 다음 단계를 수행한다:
ref 를 ? Evaluation of
constructExpr 의 결과로 한다.
constructor 를 ? GetValue (ref )로 한다.
만약 arguments 가 empty 이면,
argList 를 새로운 빈 리스트 로
한다.
그 외에는,
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
IsConstructor (constructor )
가 false 이면 TypeError 예외를 throw한다.
? Construct (constructor ,
argList )를 반환한다.
13.3.6 함수 호출
13.3.6.1 런타임 의미론: 평가
CallExpression :
CoverCallExpressionAndAsyncArrowHead
expr 를 CallMemberExpression 로 한다. 이는
포함된 CoverCallExpressionAndAsyncArrowHead 이다.
memberExpr 를 expr 의 MemberExpression 로 한다.
arguments 를 expr 의 Arguments 로 한다.
ref 를 ? Evaluation of
memberExpr 의 결과로 한다.
func 를 ? GetValue (ref )로 한다.
만약 ref 가 Reference
Record 이고, IsPropertyReference (ref )
가 false 이며, ref .[[ReferencedName]] 이 "eval" 이면,
SameValue (func ,
%eval% )가
true 이면,
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
argList 에 요소가 없다면 undefined 를 반환한다.
evalArg 를 argList 의 첫 번째 요소로 한다.
IsStrict (this CallExpression )가
true 이면 strictCaller 를
true 로, 그렇지 않으면 strictCaller 를
false 로 한다.
? PerformEval (evalArg ,
strictCaller , true )의 결과를 반환한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (func ,
ref , arguments , tailCall )의 결과를 반환한다.
CallExpression 의 평가가
6.a.v 단계를 실행하면, 이는
직접 eval(direct eval) 이다.
CallExpression :
CallExpression
Arguments
ref 를 ? Evaluation of
CallExpression 의
결과로 한다.
func 를 ? GetValue (ref )로 한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (func ,
ref , Arguments , tailCall )의 결과를
반환한다.
13.3.6.2 EvaluateCall ( func , ref ,
arguments , tailPosition )
추상 연산 EvaluateCall은 func (ECMAScript 언어 값 ),
ref (ECMAScript 언어 값 또는 Reference Record ),
arguments (파스 노드 ), tailPosition (불리언)를
인수로 받고, 정상 완료 가 담긴 ECMAScript 언어 값 또는 비정상 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
ref 가 Reference
Record 라면,
IsPropertyReference (ref )
가 true 라면,
thisValue 를 GetThisValue (ref )로
한다.
그 외에는,
refEnv 를 ref .[[Base]] 로
한다.
Assert : refEnv 는
Environment
Record 이다.
thisValue 를 refEnv .WithBaseObject()로 한다.
그 외에는,
thisValue 를 undefined 로 한다.
argList 를 ? ArgumentListEvaluation of
arguments 의 결과로 한다.
func 가 객체가 아니면 TypeError
예외를 throw한다.
IsCallable (func )가
false 이면 TypeError 예외를 throw한다.
tailPosition 이 true 이면, PrepareForTailCall ()를 수행한다.
? Call (func ,
thisValue , argList )의 결과를 반환한다.
13.3.7 super 키워드
13.3.7.1 런타임 의미론: 평가
SuperProperty :
super
[
Expression
]
env 를 GetThisEnvironment ()로 한다.
actualThis 를 ? env .GetThisBinding()으로 한다.
propertyNameReference 를 ? Evaluation of Expression 의 결과로 한다.
propertyNameValue 를 ? GetValue (propertyNameReference )로
한다.
strict 를 IsStrict (this SuperProperty )로 한다.
참고: 대부분의 경우, ToPropertyKey 가 이 단계 직후
propertyNameValue 에 대해 수행된다. 그러나 super[b] = c의 경우
c의 평가가 끝난 뒤에 수행된다.
MakeSuperPropertyReference (actualThis ,
propertyNameValue , strict )를 반환한다.
SuperProperty :
super
.
IdentifierName
env 를 GetThisEnvironment ()로 한다.
actualThis 를 ? env .GetThisBinding()으로 한다.
propertyKey 를 StringValue of
IdentifierName 로
한다.
strict 를 IsStrict (this SuperProperty )로 한다.
MakeSuperPropertyReference (actualThis ,
propertyKey , strict )를 반환한다.
SuperCall :
super
Arguments
newTarget 를 GetNewTarget ()로 한다.
Assert :
newTarget 는 생성자 이다.
func 를 GetSuperConstructor ()로 한다.
argList 를 ? ArgumentListEvaluation of Arguments 의 결과로 한다.
IsConstructor (func )가
false 이면 TypeError 예외를 throw한다.
result 를 ? Construct (func ,
argList , newTarget )의 결과로 한다.
thisER 를 GetThisEnvironment ()로 한다.
Assert :
thisER 는 함수 환경 레코드(Function
Environment Record) 이다.
? BindThisValue (thisER ,
result )를 수행한다.
F 를 thisER .[[FunctionObject]] 로 한다.
Assert :
F 는 ECMAScript 함수 객체(function object) 이다.
? InitializeInstanceElements (result ,
F )를 수행한다.
result 를 반환한다.
13.3.7.2 GetSuperConstructor ( )
추상 연산 GetSuperConstructor는 인수를 받지 않으며 ECMAScript 언어 값 을
반환한다. 호출 시 다음 단계를 수행한다:
envRec 를 GetThisEnvironment ()로 한다.
Assert :
envRec 는 함수 환경 레코드(Function
Environment Record) 이다.
activeFunction 을 envRec .[[FunctionObject]] 로 한다.
Assert :
activeFunction 은 ECMAScript 함수 객체(function
object) 이다.
superConstructor 를 ! activeFunction .[[GetPrototypeOf]] ()의 결과로 한다.
superConstructor 를 반환한다.
13.3.7.3 MakeSuperPropertyReference ( actualThis ,
propertyKey , strict )
추상 연산 MakeSuperPropertyReference는 actualThis (ECMAScript 언어 값 ),
propertyKey (ECMAScript 언어 값 ),
strict (불리언)를 인수로 받고, Super Reference Record 를 반환한다. 호출 시 다음
단계를 수행한다:
env 를 GetThisEnvironment ()로 한다.
Assert :
env .HasSuperBinding()이 true 이다.
Assert :
env 는 함수 환경 레코드(Function Environment
Record) 이다.
baseValue 를 GetSuperBase (env )로 한다.
Reference
Record { [[Base]] :
baseValue , [[ReferencedName]] :
propertyKey , [[Strict]] : strict , [[ThisValue]] : actualThis }를 반환한다.
13.3.8 인수 목록
참고
인수 목록의 평가는 값들의 리스트 를 생성한다.
13.3.8.1 런타임 의미론: ArgumentListEvaluation
구문 지향 연산
ArgumentListEvaluation은 인수를 받지 않으며, 리스트 에 담긴
ECMAScript 언어 값 들의 정상 완료(normal
completion) 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:
Arguments :
(
)
새로운 빈 리스트 를 반환한다.
ArgumentList :
AssignmentExpression
ref 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
arg 를 ? GetValue (ref )로 한다.
« arg »를 반환한다.
ArgumentList :
...
AssignmentExpression
list 를 새로운 빈 리스트 로 한다.
spreadRef 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
spreadObj 를 ? GetValue (spreadRef )로 한다.
iteratorRecord 를 ? GetIterator (spreadObj ,
sync )로 한다.
반복,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면 list 를 반환한다.
next 를 list 에 추가한다.
ArgumentList :
ArgumentList
,
AssignmentExpression
precedingArgs 를 ? ArgumentListEvaluation of ArgumentList 의 결과로 한다.
ref 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
arg 를 ? GetValue (ref )로 한다.
precedingArgs 와 « arg »의 리스트 결합 을 반환한다.
ArgumentList :
ArgumentList
,
...
AssignmentExpression
precedingArgs 를 ? ArgumentListEvaluation of ArgumentList 의 결과로 한다.
spreadRef 를 ? Evaluation of
AssignmentExpression 의 결과로 한다.
iteratorRecord 를 ? GetIterator (?
GetValue (spreadRef ),
sync )로 한다.
반복,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이면
precedingArgs 를 반환한다.
next 를 precedingArgs 에 추가한다.
TemplateLiteral
: NoSubstitutionTemplate
templateLiteral 을 this TemplateLiteral 로 한다.
siteObj 를 GetTemplateObject (templateLiteral )로
한다.
« siteObj »를 반환한다.
TemplateLiteral
: SubstitutionTemplate
templateLiteral 을 this TemplateLiteral 로 한다.
siteObj 를 GetTemplateObject (templateLiteral )로
한다.
remaining 을 ? ArgumentListEvaluation of SubstitutionTemplate 의 결과로 한다.
« siteObj »와 remaining 의 리스트 결합 을 반환한다.
SubstitutionTemplate
:
TemplateHead
Expression
TemplateSpans
firstSubRef 를 ? Evaluation of
Expression 의 결과로 한다.
firstSub 를 ? GetValue (firstSubRef )로 한다.
restSub 를 ? SubstitutionEvaluation of TemplateSpans 의 결과로
한다.
Assert :
restSub 는 비어 있을 수도 있는 리스트 이다.
« firstSub »와 restSub 의 리스트 결합 을 반환한다.
13.3.9 옵셔널 체이닝
참고
옵셔널 체이닝은 하나 이상의 프로퍼티 접근 또는 함수 호출로 이루어진 체인으로, 그 첫 번째가 ?.
토큰으로 시작한다.
13.3.9.1 런타임 의미론: 평가
OptionalExpression
:
MemberExpression
OptionalChain
baseReference 를 ? Evaluation of
MemberExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression
:
CallExpression
OptionalChain
baseReference 를 ? Evaluation of
CallExpression 의
결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression
:
OptionalExpression
OptionalChain
baseReference 를 ? Evaluation of
OptionalExpression 의 결과로 한다.
baseValue 를 ? GetValue (baseReference )로 한다.
만약 baseValue 가 undefined 또는 null 이면,
undefined 를 반환한다.
? ChainEvaluation of OptionalChain 에
baseValue 와 baseReference 를 인수로 하여 호출한 결과를 반환한다.
13.3.9.2 런타임 의미론: ChainEvaluation
구문 지향 연산
ChainEvaluation은 baseValue (ECMAScript 언어 값 ),
baseReference (ECMAScript 언어 값 또는 Reference Record )를
인수로 받고, 정상 완료(normal
completion) 가 담긴 ECMAScript 언어 값
또는 Reference Record 또는
비정상 완료(abrupt
completion) 를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:
OptionalChain :
?.
Arguments
thisChain 을 this OptionalChain 로 한다.
tailCall 을 IsInTailPosition (thisChain )로
한다.
? EvaluateCall (baseValue ,
baseReference , Arguments , tailCall )의 결과를
반환한다.
OptionalChain :
?.
[
Expression
]
strict 를 IsStrict (this OptionalChain )로 한다.
? EvaluatePropertyAccessWithExpressionKey (baseValue ,
Expression ,
strict )의 결과를 반환한다.
OptionalChain :
?.
IdentifierName
strict 를 IsStrict (this OptionalChain )로 한다.
EvaluatePropertyAccessWithIdentifierKey (baseValue ,
IdentifierName ,
strict )의 결과를 반환한다.
OptionalChain :
?.
PrivateIdentifier
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (baseValue ,
fieldNameString )의 결과를 반환한다.
OptionalChain :
OptionalChain
Arguments
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
thisChain 을 this OptionalChain 로 한다.
tailCall 을 IsInTailPosition (thisChain )로
한다.
? EvaluateCall (newValue ,
newReference , Arguments , tailCall )의 결과를
반환한다.
OptionalChain :
OptionalChain
[
Expression
]
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
strict 를 IsStrict (this OptionalChain )로 한다.
? EvaluatePropertyAccessWithExpressionKey (newValue ,
Expression ,
strict )의 결과를 반환한다.
OptionalChain :
OptionalChain
.
IdentifierName
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
strict 를 IsStrict (this OptionalChain )로 한다.
EvaluatePropertyAccessWithIdentifierKey (newValue ,
IdentifierName ,
strict )의 결과를 반환한다.
OptionalChain :
OptionalChain
.
PrivateIdentifier
optionalChain 을 OptionalChain 로 한다.
newReference 를 ? ChainEvaluation of
optionalChain 에 baseValue 와 baseReference 를 인수로 하여 호출한
결과로 한다.
newValue 를 ? GetValue (newReference )로 한다.
fieldNameString 을 StringValue of
PrivateIdentifier 로 한다.
MakePrivateReference (newValue ,
fieldNameString )의 결과를 반환한다.
13.3.10 import 호출
13.3.10.1 런타임 의미론: 평가
ImportCall :
import
(
AssignmentExpression
,opt
)
? EvaluateImportCall (AssignmentExpression )을 반환한다.
ImportCall :
import
(
AssignmentExpression
,
AssignmentExpression
,opt
)
? EvaluateImportCall (첫 번째 AssignmentExpression , 두 번째
AssignmentExpression )을 반환한다.
13.3.10.2 EvaluateImportCall ( specifierExpression [
, optionsExpression ] )
추상 연산 EvaluateImportCall은 specifierExpression (파스
노드 )와 선택적 인수 optionsExpression (파스
노드 )를 인수로 받고, 프로미스가 담긴 정상 완료(normal
completion) 또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
referrer 를 GetActiveScriptOrModule ()로
한다.
referrer 가 null 이면 referrer 를 현재 Realm
Record 로 설정한다.
specifierRef 를 ? Evaluation of
specifierExpression 의 결과로 한다.
specifier 를 ? GetValue (specifierRef )로 한다.
optionsExpression이 존재하면,
optionsRef 를 ? Evaluation
of
optionsExpression 의 결과로 한다.
options 를 ? GetValue (optionsRef )로
한다.
그 외에는,
options 를 undefined 로 한다.
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
specifierString 을 Completion (ToString (specifier ))로 한다.
IfAbruptRejectPromise (specifierString ,
promiseCapability )를 수행한다.
attributes 를 새로운 빈 리스트 로 한다.
options 가 undefined 가 아니면,
options 가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] , undefined , «
새로 생성된 TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를
반환한다.
attributesObj 를 Completion (Get (options ,
"with" ))로 한다.
IfAbruptRejectPromise (attributesObj ,
promiseCapability )를 수행한다.
attributesObj가 undefined 가 아니면,
attributesObj가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] ,
undefined , « 새로 생성된
TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
entries 를 Completion (EnumerableOwnProperties (attributesObj ,
key+value ))로 한다.
IfAbruptRejectPromise (entries ,
promiseCapability )를 수행한다.
entries의 각 요소 entry 에 대해,
key 를 ! Get (entry ,
"0" )로 한다.
value 를 ! Get (entry ,
"1" )로 한다.
key가 문자열이면 ,
value가 문자열이
아니면 ,
! Call (promiseCapability .[[Reject]] ,
undefined , « 새로 생성된
TypeError
객체 »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
ImportAttribute
Record { [[Key]] : key ,
[[Value]] :
value }를 attributes 에 추가한다.
AllImportAttributesSupported (attributes )
가 false 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
새로 생성된 TypeError 객체 »)를 수행한다.
promiseCapability .[[Promise]] 를
반환한다.
attributes를 각 [[Key]] 필드 값을 UTF-16 코드 유닛의 시퀀스로 취급하여
사전식(lexicographic)으로 정렬한다. 참고: 이 정렬은 호스트 가 속성의 열거 순서에 따라 동작을 바꾸지
못하도록 금지하는 목적에서만 관찰 가능하다.
moduleRequest 를 ModuleRequest
Record { [[Specifier]] :
specifierString , [[Attributes]] :
attributes }로 한다.
HostLoadImportedModule (referrer ,
moduleRequest , empty ,
promiseCapability )를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
13.3.10.3 ContinueDynamicImport ( promiseCapability ,
moduleCompletion )
추상 연산 ContinueDynamicImport는 promiseCapability (PromiseCapability Record ),
moduleCompletion (정상 완료(normal
completion) 가 담긴 Module Record 또는
throw completion )를
인수로 받고 unused 를 반환한다. 이는 import() 호출로 시작된
동적 import의 처리를 완료하며, 그 호출이 반환한 프로미스를 적절히 resolve 또는 reject 한다. 호출 시 다음 단계를 수행한다:
moduleCompletion 이 비정상 완료(abrupt
completion) 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
moduleCompletion .[[Value]] »)를 수행한다.
unused 를 반환한다.
module 을 moduleCompletion .[[Value]] 로
한다.
loadPromise 를 module .LoadRequestedModules()로 한다.
rejectedClosure 를 매개변수 (reason )를 가지며
promiseCapability 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 한다:
! Call (promiseCapability .[[Reject]] , undefined , «
reason »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
onRejected 를 CreateBuiltinFunction (rejectedClosure ,
1, "" , « »)로 한다.
linkAndEvaluateClosure 를 매개변수 없이 module ,
promiseCapability , onRejected 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운
Abstract Closure 로 한다:
link 를 Completion (module .Link())로
한다.
link 가 비정상
완료(abrupt completion) 라면,
! Call (promiseCapability .[[Reject]] , undefined , «
link .[[Value]] »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
evaluatePromise 를 module .Evaluate()로 한다.
fulfilledClosure 를 매개변수 없이 module 과
promiseCapability 를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 한다:
namespace 를 GetModuleNamespace (module )로
한다.
! Call (promiseCapability .[[Resolve]] , undefined , «
namespace »)를 수행한다.
NormalCompletion (undefined )을
반환한다.
onFulfilled 를 CreateBuiltinFunction (fulfilledClosure ,
0, "" , « »)로 한다.
PerformPromiseThen (evaluatePromise ,
onFulfilled , onRejected )를 수행한다.
unused 를 반환한다.
linkAndEvaluate 를 CreateBuiltinFunction (linkAndEvaluateClosure ,
0, "" , « »)로 한다.
PerformPromiseThen (loadPromise ,
linkAndEvaluate , onRejected )를 수행한다.
unused 를 반환한다.
13.3.11 태그드 템플릿
참고
태그드 템플릿은 함수 호출로, 호출의 인수들은 TemplateLiteral
(13.2.8 )에서 유도된다. 실제 인수에는 템플릿
객체(13.2.8.4 )와 TemplateLiteral 내에 포함된
표현식들을 평가하여 얻은 값들이 포함된다.
13.3.11.1 런타임 의미론: 평가
MemberExpression
:
MemberExpression
TemplateLiteral
tagRef 를 ? Evaluation of
MemberExpression 의 결과로 한다.
tagFunc 를 ? GetValue (tagRef )로 한다.
thisCall 을 this MemberExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (tagFunc ,
tagRef , TemplateLiteral ,
tailCall )의 결과를 반환한다.
CallExpression :
CallExpression
TemplateLiteral
tagRef 를 ? Evaluation of
CallExpression 의
결과로 한다.
tagFunc 를 ? GetValue (tagRef )로 한다.
thisCall 을 this CallExpression 로 한다.
tailCall 을 IsInTailPosition (thisCall )로
한다.
? EvaluateCall (tagFunc ,
tagRef , TemplateLiteral ,
tailCall )의 결과를 반환한다.
13.3.12 메타 프로퍼티
13.3.12.1 런타임 의미론: 평가
NewTarget :
new
.
target
GetNewTarget ()를 반환한다.
ImportMeta :
import
.
meta
module 을 GetActiveScriptOrModule ()로
한다.
Assert :
module 은 소스 텍스트 모듈 레코드(Source Text Module
Record) 이다.
importMeta 를 module .[[ImportMeta]] 로
한다.
importMeta 가 empty 이면,
importMeta 를 OrdinaryObjectCreate (null )로
설정한다.
importMetaValues 를 HostGetImportMetaProperties (module )로
한다.
importMetaValues 의 각 Record
{ [[Key]] , [[Value]] }
p 에 대해,
! CreateDataPropertyOrThrow (importMeta ,
p .[[Key]] , p .[[Value]] )를 수행한다.
HostFinalizeImportMeta (importMeta ,
module )를 수행한다.
module .[[ImportMeta]] 를
importMeta 로 설정한다.
importMeta 를 반환한다.
그 외에는,
Assert : importMeta
객체이다 .
importMeta 를 반환한다.
13.3.12.1.1 HostGetImportMetaProperties (
moduleRecord )
호스트
정의 추상 연산 HostGetImportMetaProperties는 moduleRecord
(모듈 레코드(Module Record) )를 인수로
받고, 리스트(List) 를 반환한다.
리스트는 Record 들로 구성되며, 각
Record는 [[Key]] (프로퍼티 키 )와 [[Value]] (ECMAScript 언어
값 ) 필드를 가진다. 이 연산은 호스트 가 import.meta에서 반환되는 객체에 프로퍼티 키와 값을
제공할 수 있도록 한다.
HostGetImportMetaProperties의 기본 구현은 새로운 빈 리스트(List) 를 반환한다.
13.3.12.1.2 HostFinalizeImportMeta ( importMeta ,
moduleRecord )
호스트
정의 추상 연산 HostFinalizeImportMeta는 importMeta (객체)와
moduleRecord (모듈 레코드(Module Record) )를 인수로
받고 unused 를 반환한다. 이 연산은 호스트 가 import.meta에서 반환되는 객체를 ECMAScript
코드에 노출하기 전에 특별한 처리를 할 수 있도록 한다.
대부분의 호스트 는 HostGetImportMetaProperties 만
정의하고, HostFinalizeImportMeta는 기본 동작을 사용하면 된다. 그러나 HostFinalizeImportMeta는 호스트 가 객체를 직접 조작해야 할 경우를 위한
"탈출구"를 제공한다.
HostFinalizeImportMeta의 기본 구현은 unused 를 반환한다.
13.4 증감식
구문
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
LeftHandSideExpression [?Yield,
?Await]
[여기에 LineTerminator 없음]
++
LeftHandSideExpression [?Yield,
?Await]
[여기에 LineTerminator 없음]
--
++
UnaryExpression [?Yield,
?Await]
--
UnaryExpression [?Yield,
?Await]
13.4.1 정적 의미론: 초기 에러
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
UpdateExpression :
++
UnaryExpression
--
UnaryExpression
13.4.2 후위 증가 연산자
13.4.2.1 런타임 의미론: 평가
UpdateExpression
:
LeftHandSideExpression
++
lhs 를 ? Evaluation of
LeftHandSideExpression 의 결과로
한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (lhs ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::add (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::add (oldValue ,
1 ℤ )로 한다.
? PutValue (lhs ,
newValue )를 수행한다.
oldValue 를 반환한다.
13.4.3 후위 감소 연산자
13.4.3.1 런타임 의미론: 평가
UpdateExpression
:
LeftHandSideExpression
--
lhs 를 ? Evaluation of
LeftHandSideExpression 의 결과로
한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (lhs ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::subtract (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::subtract (oldValue ,
1 ℤ )로 한다.
? PutValue (lhs ,
newValue )를 수행한다.
oldValue 를 반환한다.
13.4.4 전위 증가 연산자
13.4.4.1 런타임 의미론: 평가
UpdateExpression
:
++
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
UnaryExpression 의 AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::add (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::add (oldValue ,
1 ℤ )로 한다.
? PutValue (expr ,
newValue )를 수행한다.
newValue 를 반환한다.
13.4.5 전위 감소 연산자
13.4.5.1 런타임 의미론: 평가
UpdateExpression
:
--
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
UnaryExpression 의 AssignmentTargetType 이
web-compat 이면, ReferenceError 예외를 발생시킨다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
newValue 를 Number::subtract (oldValue ,
1 𝔽 )로 한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
newValue 를 BigInt::subtract (oldValue ,
1 ℤ )로 한다.
? PutValue (expr ,
newValue )를 수행한다.
newValue 를 반환한다.
13.5 단항 연산자
구문
UnaryExpression [Yield,
Await] :
UpdateExpression [?Yield,
?Await]
delete
UnaryExpression [?Yield,
?Await]
void
UnaryExpression [?Yield,
?Await]
typeof
UnaryExpression [?Yield,
?Await]
+
UnaryExpression [?Yield,
?Await]
-
UnaryExpression [?Yield,
?Await]
~
UnaryExpression [?Yield,
?Await]
!
UnaryExpression [?Yield,
?Await]
[+Await]
AwaitExpression [?Yield]
13.5.1 delete 연산자
13.5.1.1 정적 의미론: 초기 에러
UnaryExpression
:
delete
UnaryExpression
참고
마지막 규칙은 delete (((foo)))와 같은 표현식이 첫 번째 규칙의 재귀적 적용으로 인해 초기 에러 를
발생시킴을 의미한다.
13.5.1.2 런타임 의미론: 평가
UnaryExpression
:
delete
UnaryExpression
ref 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
ref 가 Reference
Record 가 아니면, true 를 반환한다.
IsUnresolvableReference (ref )
가 true 이면,
Assert : ref .[[Strict]] 가 false 이다.
true 를 반환한다.
IsPropertyReference (ref )
가 true 이면,
Assert : IsPrivateReference (ref )
가 false 이다.
IsSuperReference (ref )
가 true 이면, ReferenceError 예외를 발생시킨다.
baseObj 를 ? ToObject (ref .[[Base]] )로 한다.
ref .[[ReferencedName]] 가 프로퍼티
키 가 아니면,
ref .[[ReferencedName]] 를
? ToPropertyKey (ref .[[ReferencedName]] )로 설정한다.
deleteStatus 를 ? baseObj .[[Delete]] (ref .[[ReferencedName]] )로 한다.
deleteStatus 가 false 이고
ref .[[Strict]] 가
true 이면, TypeError 예외를 발생시킨다.
deleteStatus 를 반환한다.
그 외에는,
base 를 ref .[[Base]] 로 한다.
Assert : base 는 Environment Record 이다.
? base .DeleteBinding (ref .[[ReferencedName]] )을 반환한다.
참고 1
delete 연산자가 strict mode 코드 내에서 등장하면, 그
UnaryExpression 이 변수, 함수 인수, 또는 함수
이름에 대한 직접 참조인 경우 SyntaxError 예외가 발생한다. 또한, delete
연산자가 strict mode 코드 내에 있고 삭제 대상 프로퍼티의
속성이 { [[Configurable]] : false }(또는 삭제할 수
없는 경우)이면 TypeError 예외가 발생한다.
참고 2
4.c 단계에서 생성될 수 있는 객체는
위의 추상 연산과 일반 객체 [[Delete]] 내부 메서드 외부에서는 접근할 수 없다. 실제 구현에서는 실제로 객체를 생성하지 않을
수도 있다.
13.5.2 void 연산자
13.5.2.1 런타임 의미론: 평가
UnaryExpression
:
void
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
? GetValue (expr )를 수행한다.
undefined 를 반환한다.
참고
GetValue 는 그 값이 사용되지 않더라도 관찰 가능한 부작용이 있을
수 있으므로 반드시 호출되어야 한다.
13.5.3 typeof 연산자
13.5.3.1 런타임 의미론: 평가
UnaryExpression
:
typeof
UnaryExpression
val 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
val 이 Reference
Record 이면,
IsUnresolvableReference (val )
가 true 이면 "undefined" 를 반환한다.
val 를 ? GetValue (val )로 한다.
val 이 undefined 이면 "undefined" 를 반환한다.
val 이 null 이면 "object" 를 반환한다.
val 이 String 이면
"string" 를 반환한다.
val 이 Symbol 이면
"symbol" 를 반환한다.
val 이 Boolean 이면
"boolean" 를 반환한다.
val 이 Number 이면
"number" 를 반환한다.
val 이 BigInt 이면
"bigint" 를 반환한다.
Assert :
val 은 객체 이다.
참고: 이 단계는 B.3.6.3 절에서 대체된다.
val 에 [[Call]] 내부 메서드가 있으면
"function" 를 반환한다.
"object" 를 반환한다.
13.5.4 단항 + 연산자
참고
단항 + 연산자는 피연산자를 Number
타입 으로 변환한다.
13.5.4.1 런타임 의미론: 평가
UnaryExpression
:
+
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
? ToNumber (? GetValue (expr ))를 반환한다.
13.5.5 단항 - 연산자
참고
단항 - 연산자는 피연산자를 숫자 값으로 변환한 뒤 부호를 반전시킨다. +0 𝔽 의
부호를 반전하면 -0 𝔽 이 되고, -0 𝔽 의 부호를
반전하면 +0 𝔽 이 된다.
13.5.5.1 런타임 의미론: 평가
UnaryExpression
:
-
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
Number::unaryMinus (oldValue )를
반환한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
BigInt::unaryMinus (oldValue )를
반환한다.
13.5.6 비트 NOT 연산자 (~)
13.5.6.1 런타임 의미론: 평가
UnaryExpression
:
~
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ? ToNumeric (?
GetValue (expr ))로 한다.
oldValue 가 Number 이면,
Number::bitwiseNOT (oldValue )를
반환한다.
그 외에는,
Assert : oldValue 는 BigInt 이다.
BigInt::bitwiseNOT (oldValue )를
반환한다.
13.5.7 논리 NOT 연산자 (!)
13.5.7.1 런타임 의미론: 평가
UnaryExpression
:
!
UnaryExpression
expr 를 ? Evaluation of
UnaryExpression 의 결과로 한다.
oldValue 를 ToBoolean (? GetValue (expr ))로 한다.
oldValue 가 true 이면 false 를 반환한다.
true 를 반환한다.
13.6 거듭제곱 연산자
구문
ExponentiationExpression [Yield,
Await] :
UnaryExpression [?Yield,
?Await]
UpdateExpression [?Yield,
?Await]
**
ExponentiationExpression [?Yield,
?Await]
13.6.1 런타임 의미론: 평가
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
? EvaluateStringOrNumericBinaryExpression (UpdateExpression ,
**, ExponentiationExpression )를
반환한다.
13.7 곱셈 연산자
구문
MultiplicativeExpression [Yield,
Await] :
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [?Yield,
?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield,
?Await]
MultiplicativeOperator
: one of * /
%
참고
* 연산자는 곱셈을 수행하여 피연산자의 곱을 생성한다.
/ 연산자는 나눗셈을 수행하여 피연산자의 몫을 생성한다.
% 연산자는 암묵적 나눗셈에서 피연산자의 나머지를 반환한다.
13.7.1 런타임 의미론: 평가
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
opText 를 소스 텍스트에서
일치하는 MultiplicativeOperator 의 값으로 한다.
? EvaluateStringOrNumericBinaryExpression (MultiplicativeExpression ,
opText , ExponentiationExpression )를
반환한다.
13.8 덧셈 연산자
구문
AdditiveExpression [Yield,
Await] :
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
+
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
-
MultiplicativeExpression [?Yield,
?Await]
13.8.1 덧셈 연산자 (+)
참고
덧셈 연산자는 문자열 연결 또는 숫자 덧셈을 수행한다.
13.8.1.1 런타임 의미론: 평가
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression ,
+, MultiplicativeExpression )를
반환한다.
13.8.2 뺄셈 연산자 (-)
참고
- 연산자는 뺄셈을 수행하여 피연산자의 차를 생성한다.
13.8.2.1 런타임 의미론: 평가
AdditiveExpression
:
AdditiveExpression
-
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression ,
-, MultiplicativeExpression )를
반환한다.
13.9 비트 시프트 연산자
구문
ShiftExpression [Yield,
Await] :
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
<<
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>>
AdditiveExpression [?Yield,
?Await]
13.9.1 왼쪽 시프트 연산자 (<<)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 비트 단위로 왼쪽으로 시프트(이동)한다.
13.9.1.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
<<
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
<<, AdditiveExpression )를 반환한다.
13.9.2 부호 있는 오른쪽 시프트 연산자 (>>)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 부호 비트를 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.
13.9.2.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
>>, AdditiveExpression )를 반환한다.
13.9.3 부호 없는 오른쪽 시프트 연산자 (>>>
)
참고
왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 0으로 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.
13.9.3.1 런타임 의미론: 평가
ShiftExpression
:
ShiftExpression
>>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression ,
>>>, AdditiveExpression )를 반환한다.
13.10 관계 연산자
참고 1
관계 연산자를 평가한 결과는 항상 Boolean 타입이며, 피연산자 간의 관계가 연산자가 지정한 관계를 만족하는지 여부를 나타낸다.
구문
RelationalExpression [In,
Yield, Await] :
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
instanceof
ShiftExpression [?Yield,
?Await]
[+In]
RelationalExpression [+In,
?Yield, ?Await]
in
ShiftExpression [?Yield,
?Await]
[+In]
PrivateIdentifier
in
ShiftExpression [?Yield,
?Await]
참고 2
[In] 문법 매개변수는 관계식에서 in 연산자와 for 문에서의 in
연산자를 혼동하지 않도록 필요하다.
13.10.1 런타임 의미론: 평가
RelationalExpression
:
RelationalExpression
<
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (lVal , rVal ,
true )로 한다.
r 가 undefined 이면 false 를, 아니면
r 를 반환한다.
RelationalExpression
:
RelationalExpression
>
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (rVal , lVal ,
false )로 한다.
r 가 undefined 이면 false 를, 아니면
r 를 반환한다.
RelationalExpression
:
RelationalExpression
<=
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (rVal , lVal ,
false )로 한다.
r 가 true 또는 undefined 이면
false 를, 아니면 true 를 반환한다.
RelationalExpression
:
RelationalExpression
>=
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLessThan (lVal , rVal ,
true )로 한다.
r 가 true 또는 undefined 이면
false 를, 아니면 true 를 반환한다.
RelationalExpression
:
RelationalExpression
instanceof
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? InstanceofOperator (lVal ,
rVal )를 반환한다.
RelationalExpression
:
RelationalExpression
in
ShiftExpression
lRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
rVal 이 객체가 아니면 , TypeError 예외를
throw한다.
? HasProperty (rVal , ? ToPropertyKey (lVal ))를 반환한다.
RelationalExpression
:
PrivateIdentifier
in
ShiftExpression
privateIdentifier 를 StringValue of PrivateIdentifier 로
한다.
rRef 를 ? Evaluation of ShiftExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
rVal 이 객체가 아니면 , TypeError 예외를
throw한다.
privateEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 PrivateEnvironment로 한다.
Assert :
privateEnv 는 null 이 아니다.
privateName 을 ResolvePrivateIdentifier (privateEnv ,
privateIdentifier )로 한다.
PrivateElementFind (rVal ,
privateName )이 empty 가 아니면 true 를
반환한다.
false 를 반환한다.
13.10.2 InstanceofOperator ( V , target )
추상 연산 InstanceofOperator는 V (ECMAScript 언어 값 )와
target (ECMAScript 언어 값 )을 인수로 받고,
Boolean이 담긴 정상 완료 또는
throw completion 를 반환한다.
이 연산은 target 의 %Symbol.hasInstance% 메서드를 참조하거나, 없을 경우
target 의 "prototype" 프로퍼티 값이 V 의 프로토타입 체인에 존재하는지를 확인하여
V 가 target 의 인스턴스인지 판별한다. 호출 시 다음 단계를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
throw한다.
instOfHandler 를 ? GetMethod (target , %Symbol.hasInstance% )로 한다.
instOfHandler 가 undefined 가 아니면,
ToBoolean (? Call (instOfHandler ,
target , « V »))를 반환한다.
IsCallable (target )이
false 이면 TypeError 예외를 throw한다.
? OrdinaryHasInstance (target ,
V )를 반환한다.
참고
단계 4 와 5 는 %Symbol.hasInstance% 메서드를 사용하지 않는
이전 ECMAScript 판과의 호환성을 제공한다. 객체가 %Symbol.hasInstance% 를 정의하거나 상속하지
않은 경우
기본 instanceof 의미론을 사용한다.
13.11 동등 연산자
참고
동등 연산자를 평가한 결과는 항상 Boolean 타입이며, 연산자가 지칭하는 관계가 두 피연산자 사이에 성립하는지 여부를 나타낸다.
구문
EqualityExpression [In, Yield,
Await] :
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
==
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!=
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
===
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!==
RelationalExpression [?In,
?Yield, ?Await]
13.11.1 런타임 의미론: 평가
EqualityExpression
:
EqualityExpression
==
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? IsLooselyEqual (rVal ,
lVal )을 반환한다.
EqualityExpression
:
EqualityExpression
!=
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 ? IsLooselyEqual (rVal ,
lVal )로 한다.
r 가 true 이면 false 를, 아니면
true 를 반환한다.
EqualityExpression
:
EqualityExpression
===
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
IsStrictlyEqual (rVal ,
lVal )을 반환한다.
EqualityExpression
:
EqualityExpression
!==
RelationalExpression
lRef 를 ? Evaluation of EqualityExpression 의
결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of RelationalExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
r 를 IsStrictlyEqual (rVal ,
lVal )로 한다.
r 가 true 이면 false 를, 아니면
true 를 반환한다.
참고 1
위의 동등 연산 정의에 따르면:
문자열 비교를 강제하려면: `${a}` == `${b}`를 사용한다.
숫자 비교를 강제하려면: +a == +b를 사용한다.
불리언 비교를 강제하려면: !a == !b를 사용한다.
참고 2
동등 연산자는 다음 불변식을 유지한다:
A != B는 !(A == B)와 동치이다.
A == B는 B == A와 동치이나, A와 B의 평가
순서는 다를 수 있다.
참고 3
동등 연산자는 항상 추이적이지 않다. 예를 들어 동일한 문자열 값을 갖는 두 개의 서로 다른 String 객체가 있을 수 있다. 각 String 객체는
== 연산자에 의해 그 문자열 값과 동등하게 평가되지만, 두 String 객체끼리는 동등하지 않다. 예시:
new String("a") == "a" 및 "a" == new String("a")는 모두
true 이다.
new String("a") == new String("a")는 false 이다.
참고 4
문자열의 비교는 코드 유닛 값 시퀀스에 대한 단순 동등성 테스트를 사용한다. 유니코드 명세에 정의된 문자 또는 문자열 동등성 및 정렬 순서의 더 복잡한 의미론적
정의를 사용하지 않는다. 따라서 유니코드 표준에 따라 정규화된 문자열 값이라도 서로 다르다고 평가될 수 있다. 사실상 이 알고리즘은 두 문자열이 이미 정규화된
형태임을 전제로 한다.
13.12 이진 비트 연산자
구문
BitwiseANDExpression [In,
Yield, Await] :
EqualityExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [?In,
?Yield, ?Await]
&
EqualityExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [In,
Yield, Await] :
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [?In,
?Yield, ?Await]
^
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseORExpression [In,
Yield, Await] :
BitwiseXORExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
|
BitwiseXORExpression [?In,
?Yield, ?Await]
13.12.1 런타임 의미론: 평가
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseANDExpression ,
&, EqualityExpression )를 반환한다.
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseXORExpression ,
^, BitwiseANDExpression )를 반환한다.
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseORExpression ,
|, BitwiseXORExpression )를 반환한다.
13.13 이진 논리 연산자
구문
LogicalANDExpression [In,
Yield, Await] :
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [?In,
?Yield, ?Await]
&&
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalORExpression [In,
Yield, Await] :
LogicalANDExpression [?In,
?Yield, ?Await]
LogicalORExpression [?In,
?Yield, ?Await]
||
LogicalANDExpression [?In,
?Yield, ?Await]
CoalesceExpression [In, Yield,
Await] :
CoalesceExpressionHead [?In,
?Yield, ?Await]
??
BitwiseORExpression [?In,
?Yield, ?Await]
CoalesceExpressionHead [In,
Yield, Await] :
CoalesceExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [In,
Yield, Await] :
LogicalORExpression [?In,
?Yield, ?Await]
CoalesceExpression [?In,
?Yield, ?Await]
참고
&& 또는 || 연산자가 생성하는 값은 반드시 Boolean 타입일 필요는 없다. 생성되는 값은 항상 두
피연산자 중 하나의 값이 된다.
13.13.1 런타임 의미론: 평가
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
lRef 를 ? Evaluation of LogicalANDExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
ToBoolean (lVal )이
false 이면 lVal 를 반환한다.
rRef 를 ? Evaluation of BitwiseORExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
lRef 를 ? Evaluation of LogicalORExpression 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
ToBoolean (lVal )이
true 이면 lVal 를 반환한다.
rRef 를 ? Evaluation of LogicalANDExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
lRef 를 ? Evaluation of CoalesceExpressionHead 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
lVal 가 undefined 또는 null 이면,
rRef 를 ? Evaluation of
BitwiseORExpression 의 결과로
한다.
? GetValue (rRef )를 반환한다.
그 외에는,
lVal 를 반환한다.
13.14 조건 연산자 (? :)
구문
ConditionalExpression [In,
Yield, Await] :
ShortCircuitExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [?In,
?Yield, ?Await]
?
AssignmentExpression [+In,
?Yield, ?Await]
:
AssignmentExpression [?In,
?Yield, ?Await]
참고
ECMAScript에서 ConditionalExpression 의 문법은 C와 Java와
약간 다릅니다. C와 Java는 두 번째 부분식에 Expression 을 허용하지만, 세 번째 식은 ConditionalExpression 으로 제한합니다.
ECMAScript에서 이 차이를 둔 이유는 조건문의 어느 쪽 분기에도 할당식을 둘 수 있도록 하고, 가운데 식으로 콤마 식이 오는 혼란스럽고 거의 쓸모없는 경우를
없애기 위함입니다.
13.14.1 런타임 의미론: 평가
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
lRef 를 ? Evaluation of ShortCircuitExpression 의 결과로 한다.
lVal 를 ToBoolean (? GetValue (lRef ))로 한다.
lVal 이 true 이면,
trueRef 를 ? Evaluation of
첫 번째 AssignmentExpression 의 결과로
한다.
? GetValue (trueRef )를 반환한다.
그 외에는,
falseRef 를 ? Evaluation of
두 번째 AssignmentExpression 의 결과로
한다.
? GetValue (falseRef )를 반환한다.
13.15 할당 연산자
구문
AssignmentExpression [In,
Yield, Await] :
ConditionalExpression [?In,
?Yield, ?Await]
[+Yield]
YieldExpression [?In,
?Await]
ArrowFunction [?In, ?Yield,
?Await]
AsyncArrowFunction [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
AssignmentOperator
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
&&=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
||=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
??=
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentOperator :
one of *= /= %=
+= -= <<= >>=
>>>= &= ^= |=
**=
13.15.1 정적 의미론: 초기 에러
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
AssignmentExpression
:
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
AssignmentExpression
:
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
13.15.2 런타임 의미론: 평가
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression 이 ObjectLiteral 도 아니고
ArrayLiteral 도 아니면,
lRef 를 ? Evaluation of
LeftHandSideExpression 의
결과로 한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면 ReferenceError 예외를
throw한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef
of LeftHandSideExpression 가
true 이면,
lhs 를 StringValue
of LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression
with argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of AssignmentExpression 의
결과로 한다.
rVal 를 ? GetValue (rRef )로
한다.
? PutValue (lRef ,
rVal )를 수행한다.
rVal 를 반환한다.
assignmentPattern 을 AssignmentPattern 으로 하며, 이는 커버(cover) 되어야 하며 LeftHandSideExpression 에 의해
포함된다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? DestructuringAssignmentEvaluation of
assignmentPattern with argument rVal 을 수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
LeftHandSideExpression 의
AssignmentTargetType 이
web-compat 이면 ReferenceError 예외를 throw한다.
lVal 를
? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
assignmentOpText 를 소스 텍스트에서
일치하는 AssignmentOperator 의 값으로 한다.
opText 를 다음 표에서 assignmentOpText 에 해당하는 유니코드 코드 포인트 시퀀스로 한다:
assignmentOpText
opText
**=
**
*=
*
/=
/
%=
%
+=
+
-=
-
<<=
<<
>>=
>>
>>>=
>>>
&=
&
^=
^
|=
|
r 를 ? ApplyStringOrNumericBinaryOperator (lVal ,
opText , rVal )로 한다.
? PutValue (lRef , r )를
수행한다.
r 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
&&=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
ToBoolean (lVal )이
false 이면 lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
||=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
ToBoolean (lVal )이
true 이면 lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
AssignmentExpression
:
LeftHandSideExpression
??=
AssignmentExpression
lRef 를 ? Evaluation of LeftHandSideExpression 의 결과로 한다.
lVal 를
? GetValue (lRef )로 한다.
lVal 가 undefined 도 아니고 null 도 아니면
lVal 를 반환한다.
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이고 IsIdentifierRef of
LeftHandSideExpression 가
true 이면,
lhs 를 StringValue of
LeftHandSideExpression 로
한다.
rVal 를 ? NamedEvaluation of AssignmentExpression with
argument lhs 로 한다.
그 외에는,
rRef 를 ? Evaluation of
AssignmentExpression 의 결과로
한다.
rVal 를 ? GetValue (rRef )로 한다.
? PutValue (lRef , rVal )를
수행한다.
rVal 를 반환한다.
참고
이 표현식이 strict mode 코드 내에 있을 때, 1.e ,
3 ,
2 ,
2 ,
2
단계의 lRef 가 해결할 수 없는 참조라면 런타임 오류가 발생하며, ReferenceError 예외가
throw된다. 또한 9 ,
6 ,
6 ,
6
단계의 lRef 가 데이터 프로퍼티 로서 { [[Writable]] : false } 속성을 갖거나, 접근자
프로퍼티 로서 { [[Set]] :
undefined } 속성을 갖거나, IsExtensible 가
false 를 반환하는 객체의 존재하지 않는 프로퍼티라면 TypeError 예외가
throw된다.
13.15.3 ApplyStringOrNumericBinaryOperator ( lVal ,
opText , rVal )
추상 연산 ApplyStringOrNumericBinaryOperator는 lVal (ECMAScript 언어 값 ), opText
(**, *, /, %,
+, -, <<, >>,
>>>, &, ^, 또는 |),
rVal (ECMAScript 언어 값 )을 인수로 받으며, String,
BigInt 또는 Number가 담긴 정상 완료 또는
throw completion 를 반환한다.
호출 시 다음 단계를 수행한다:
opText 가 +이면,
lPrim 을 ? ToPrimitive (lVal )로 한다.
rPrim 을 ? ToPrimitive (rVal )로 한다.
lPrim 이 String 이거나
rPrim 이 String 이면,
lStr 을 ? ToString (lPrim )로
한다.
rStr 을 ? ToString (rPrim )로
한다.
lStr 과 rStr 의 문자열
연결(string-concatenation) 결과를 반환한다.
lVal 을 lPrim 으로 설정한다.
rVal 을 rPrim 으로 설정한다.
NOTE: 이 시점에서 반드시 숫자 연산이어야 한다.
lNum 을 ? ToNumeric (lVal )로 한다.
rNum 을 ? ToNumeric (rVal )로 한다.
SameType (lNum , rNum )이
false 이면, TypeError 예외를 throw한다.
lNum 이 BigInt 이면,
opText 가 **이면, ? BigInt::exponentiate (lNum ,
rNum )를 반환한다.
opText 가 /이면, ? BigInt::divide (lNum ,
rNum )를 반환한다.
opText 가 %이면, ? BigInt::remainder (lNum ,
rNum )를 반환한다.
opText 가 >>>이면, ? BigInt::unsignedRightShift (lNum ,
rNum )를 반환한다.
operation 을 아래 표에서 opText 와 연관된 추상 연산으로 한다:
그 외에는,
Assert :
lNum 이 Number 임을
보장한다.
operation 을 아래 표에서 opText 와 연관된 추상 연산으로 한다:
operation (lNum , rNum )을 반환한다.
참고 1
단계 ToPrimitive 의 호출에는 힌트가 제공되지 않는다(1.a , 1.b ). 표준 객체(날짜 객체 제외)는
힌트가 없으면 number 가 주어진 것처럼 동작하며, 날짜 객체는
string 이 주어진 것처럼 동작한다. Exotic 객체 는 힌트가 없을 때 다르게 동작할 수
있다.
참고 2
1.c 단계는 3 단계 및 IsLessThan 알고리즘과 달리 논리합(or)
연산을 사용한다.
13.15.4 EvaluateStringOrNumericBinaryExpression (
leftOperand , opText , rightOperand )
추상 연산 EvaluateStringOrNumericBinaryExpression는 leftOperand (파스 노드(Parse
Node) ), opText (유니코드 코드 포인트의 시퀀스), rightOperand
(파스
노드(Parse Node) )를 인수로 받고, String, BigInt, Number가 담긴 정상 완료(normal completion)
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
lRef 를 ? Evaluation of
leftOperand 의 결과로 한다.
lVal 를 ? GetValue (lRef )로 한다.
rRef 를 ? Evaluation of
rightOperand 의 결과로 한다.
rVal 를 ? GetValue (rRef )로 한다.
? ApplyStringOrNumericBinaryOperator (lVal ,
opText , rVal )를 반환한다.
13.15.5 구조 분해 할당
보충 구문
다음의 생성식의 인스턴스 처리를 수행할 때
AssignmentExpression
:
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression 의 해석은 다음 문법을 사용하여
정교화된다:
AssignmentPattern [Yield,
Await] :
ObjectAssignmentPattern [?Yield,
?Await]
ArrayAssignmentPattern [?Yield,
?Await]
ObjectAssignmentPattern [Yield,
Await] :
{
}
{
AssignmentRestProperty [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentRestProperty [?Yield,
?Await] opt
}
ArrayAssignmentPattern [Yield,
Await] :
[
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
[
AssignmentElementList [?Yield,
?Await]
]
[
AssignmentElementList [?Yield,
?Await]
,
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
AssignmentRestProperty [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
AssignmentPropertyList [Yield,
Await] :
AssignmentProperty [?Yield,
?Await]
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentProperty [?Yield,
?Await]
AssignmentElementList [Yield,
Await] :
AssignmentElisionElement [?Yield,
?Await]
AssignmentElementList [?Yield,
?Await]
,
AssignmentElisionElement [?Yield,
?Await]
AssignmentElisionElement [Yield,
Await] :
Elision opt
AssignmentElement [?Yield,
?Await]
AssignmentProperty [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
PropertyName [?Yield,
?Await]
:
AssignmentElement [?Yield,
?Await]
AssignmentElement [Yield,
Await] :
DestructuringAssignmentTarget [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
AssignmentRestElement [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
DestructuringAssignmentTarget [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
13.15.5.1 정적 의미론: 초기 에러
AssignmentProperty
:
IdentifierReference
Initializer opt
AssignmentRestProperty
:
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget
: LeftHandSideExpression
13.15.5.2 런타임 의미론: DestructuringAssignmentEvaluation
구문 지시 연산
DestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )을 인수로 받아,
정상 완료
unused 또는 비정상
완료 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
ObjectAssignmentPattern
:
{
}
? RequireObjectCoercible (value )를
수행한다.
unused 를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentPropertyList
}
{
AssignmentPropertyList
,
}
? RequireObjectCoercible (value )를
수행한다.
? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한다.
unused 를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentRestProperty
}
? RequireObjectCoercible (value )를
수행한다.
excludedNames 를 비어 있는 새 List 로 한다.
? RestDestructuringAssignmentEvaluation
of AssignmentRestProperty 에
value , excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ObjectAssignmentPattern
:
{
AssignmentPropertyList
,
AssignmentRestProperty
}
? RequireObjectCoercible (value )를
수행한다.
excludedNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한 결과로 한다.
? RestDestructuringAssignmentEvaluation
of AssignmentRestProperty 에
value , excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ArrayAssignmentPattern
:
[
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
? IteratorClose (iteratorRecord ,
NormalCompletion (unused ))를
반환한다.
ArrayAssignmentPattern
:
[
Elision
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
Elision opt
AssignmentRestElement
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
Elision 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
Assert :
iteratorRecord .[[Done]] 이
true 임을 보장한다.
? status 를 반환한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentRestElement 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
AssignmentElementList
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
result 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
result )를 반환한다.
result 를 반환한다.
ArrayAssignmentPattern
:
[
AssignmentElementList
,
Elision opt
AssignmentRestElement opt
]
iteratorRecord 를 ? GetIterator (value ,
sync )로 한다.
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
status )를 반환한다.
? status 를 반환한다.
Elision 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
status 가 비정상
완료 라면,
Assert :
iteratorRecord .[[Done]] 이
true 임을 보장한다.
? status 를 반환한다.
AssignmentRestElement 이 존재하면,
status 를 Completion (IteratorDestructuringAssignmentEvaluation
of AssignmentRestElement
에 iteratorRecord 인수를 넘겨 수행한 결과)로 한다.
iteratorRecord .[[Done]] 이
false 이면, ? IteratorClose (iteratorRecord ,
status )를 반환한다.
? status 를 반환한다.
13.15.5.3 런타임 의미론:
PropertyDestructuringAssignmentEvaluation
구문 지시 연산
PropertyDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )을 인수로 받고,
정상 완료(normal
completion) 로 List (모든
구조 분해된 프로퍼티
키 의 리스트) 또는 비정상 완료(abrupt
completion) 를 반환한다. 아래 생성식에 대해 조각별로 정의된다:
AssignmentPropertyList
:
AssignmentPropertyList
,
AssignmentProperty
propertyNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentPropertyList 에
value 인수를 넘겨 수행한 결과로 한다.
nextNames 를 ? PropertyDestructuringAssignmentEvaluation
of AssignmentProperty 에
value 인수를 넘겨 수행한 결과로 한다.
propertyNames 와 nextNames 의 리스트
연결(list-concatenation) 결과를 반환한다.
AssignmentProperty
:
IdentifierReference
Initializer opt
P 를 StringValue of
IdentifierReference 로 한다.
lRef 를 ? ResolveBinding (P )로 한다.
v 를 ? GetV (value , P )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이면,
v 를 ? NamedEvaluation of
Initializer 에
P 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
v 를 ? GetValue (defaultValue )로
한다.
? PutValue (lRef , v )를
수행한다.
« P »를 반환한다.
AssignmentProperty
:
PropertyName
:
AssignmentElement
name 을 ? Evaluation of
PropertyName 로 한다.
? KeyedDestructuringAssignmentEvaluation of
AssignmentElement 에
value , name 인수를 넘겨 수행한다.
« name »를 반환한다.
13.15.5.4 런타임 의미론:
RestDestructuringAssignmentEvaluation
구문 지시 연산
RestDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )과
excludedNames (List 타입의
프로퍼티 키
리스트)를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다. 아래 생성식에 대해 조각별로 정의된다:
AssignmentRestProperty
:
...
DestructuringAssignmentTarget
lRef 를 ? Evaluation of
DestructuringAssignmentTarget 의
결과로 한다.
restObj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
? CopyDataProperties (restObj ,
value , excludedNames )를 수행한다.
? PutValue (lRef ,
restObj )를 반환한다.
13.15.5.5 런타임 의미론:
IteratorDestructuringAssignmentEvaluation
구문 지시 연산
IteratorDestructuringAssignmentEvaluation은 iteratorRecord (이터레이터
레코드 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
AssignmentElementList
: AssignmentElisionElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElisionElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElementList
:
AssignmentElementList
,
AssignmentElisionElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElementList 에
iteratorRecord 인수를 넘겨 수행한다.
? IteratorDestructuringAssignmentEvaluation
of AssignmentElisionElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement
: AssignmentElement
? IteratorDestructuringAssignmentEvaluation
of AssignmentElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement
:
Elision
AssignmentElement
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한다.
? IteratorDestructuringAssignmentEvaluation
of AssignmentElement 에
iteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
Elision : ,
iteratorRecord .[[Done]] 이
false 이면,
? IteratorStep (iteratorRecord )를
수행한다.
unused 를 반환한다.
Elision :
Elision
,
? IteratorDestructuringAssignmentEvaluation
of Elision 에
iteratorRecord 인수를 넘겨 수행한다.
iteratorRecord .[[Done]] 이
false 이면,
? IteratorStep (iteratorRecord )를
수행한다.
unused 를 반환한다.
AssignmentElement
:
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
value 를 undefined 로 한다.
iteratorRecord .[[Done]] 이
false 이면,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이 아니면,
value 를 next 로 설정한다.
Initializer 가 존재하고
value 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이고 IsIdentifierRef
of DestructuringAssignmentTarget 가
true 이면,
target 을 StringValue
of DestructuringAssignmentTarget 로
한다.
v 를 ? NamedEvaluation of
Initializer 에
target 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
그 외에는,
v 를 value 로 한다.
DestructuringAssignmentTarget 이
ObjectLiteral 또는
ArrayLiteral 인 경우,
nestedAssignmentPattern 을 AssignmentPattern 으로 한다.
이는 커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation
of nestedAssignmentPattern 에 v 인수를 넘겨 수행한 결과를 반환한다.
? PutValue (lRef , v )를
반환한다.
참고
왼쪽에서 오른쪽으로의 평가 순서는 구조 분해 패턴이 아닌 DestructuringAssignmentTarget 을
이터레이터에 접근하거나 Initializer 를 평가하기 전에 평가함으로써 유지된다.
AssignmentRestElement
:
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
A 를 ! ArrayCreate (0)으로 한다.
n 을 0으로 한다.
iteratorRecord .[[Done]] 이
false 인 동안 반복한다,
next 를 ? IteratorStepValue (iteratorRecord )로
한다.
next 가 done 이 아니면,
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
next )를 수행한다.
n 을 n + 1로 설정한다.
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
? PutValue (lRef ,
A )를 반환한다.
nestedAssignmentPattern 을 AssignmentPattern 으로 하고, 이는
커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation of
nestedAssignmentPattern 에 A 인수를 넘겨 수행한 결과를 반환한다.
13.15.5.6 런타임 의미론:
KeyedDestructuringAssignmentEvaluation
구문 지시 연산
KeyedDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값 )과
propertyName (프로퍼티 키 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
아래 생성식에 대해 조각별로 정의된다:
AssignmentElement
:
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget 이
ObjectLiteral 도
아니고 ArrayLiteral 도
아니면,
lRef 를 ? Evaluation
of DestructuringAssignmentTarget 의
결과로 한다.
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )이
true 이고 IsIdentifierRef
of DestructuringAssignmentTarget 가
true 이면,
target 을 StringValue
of DestructuringAssignmentTarget 로
한다.
rhsValue 를 ? NamedEvaluation of
Initializer 에
target 인수를 넘겨 수행한 결과로 한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 결과로 한다.
rhsValue 를 ? GetValue (defaultValue )로
한다.
그 외에는,
rhsValue 를 v 로 한다.
DestructuringAssignmentTarget 이
ObjectLiteral 또는
ArrayLiteral 인 경우,
assignmentPattern 을 AssignmentPattern 으로 한다.
이는 커버(cover) 되어야 하며 DestructuringAssignmentTarget 에
의해 포함된다.
? DestructuringAssignmentEvaluation
of assignmentPattern 에 rhsValue 인수를 넘겨 수행한 결과를 반환한다.
? PutValue (lRef ,
rhsValue )를 반환한다.
13.16 콤마 연산자 ( , )
구문
Expression [In, Yield,
Await] :
AssignmentExpression [?In,
?Yield, ?Await]
Expression [?In, ?Yield,
?Await]
,
AssignmentExpression [?In,
?Yield, ?Await]
13.16.1 런타임 의미론: 평가
Expression :
Expression
,
AssignmentExpression
lRef 를 ? Evaluation of Expression 의 결과로 한다.
? GetValue (lRef )를 수행한다.
rRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
? GetValue (rRef )를 반환한다.
참고
GetValue
는 값이 사용되지 않더라도 관측 가능한 부수 효과가 있을 수 있으므로 반드시 호출되어야 한다.
14 ECMAScript 언어: 문과 선언
구문
Statement [Yield, Await,
Return] :
BlockStatement [?Yield, ?Await,
?Return]
VariableStatement [?Yield,
?Await]
EmptyStatement
ExpressionStatement [?Yield,
?Await]
IfStatement [?Yield, ?Await,
?Return]
BreakableStatement [?Yield,
?Await, ?Return]
ContinueStatement [?Yield,
?Await]
BreakStatement [?Yield,
?Await]
[+Return]
ReturnStatement [?Yield,
?Await]
WithStatement [?Yield, ?Await,
?Return]
LabelledStatement [?Yield,
?Await, ?Return]
ThrowStatement [?Yield,
?Await]
TryStatement [?Yield, ?Await,
?Return]
DebuggerStatement
Declaration [Yield,
Await] :
HoistableDeclaration [?Yield,
?Await, ~Default]
ClassDeclaration [?Yield, ?Await,
~Default]
LexicalDeclaration [+In,
?Yield, ?Await]
HoistableDeclaration [Yield,
Await, Default] :
FunctionDeclaration [?Yield,
?Await, ?Default]
GeneratorDeclaration [?Yield,
?Await, ?Default]
AsyncFunctionDeclaration [?Yield,
?Await, ?Default]
AsyncGeneratorDeclaration [?Yield,
?Await, ?Default]
BreakableStatement [Yield, Await,
Return] :
IterationStatement [?Yield,
?Await, ?Return]
SwitchStatement [?Yield, ?Await,
?Return]
14.1 문 의미론
14.1.1 런타임 의미론: 평가
HoistableDeclaration
:
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
empty 를 반환한다.
HoistableDeclaration
: FunctionDeclaration
? Evaluation of FunctionDeclaration 의 결과를 반환한다.
BreakableStatement
:
IterationStatement
SwitchStatement
newLabelSet 을 비어 있는 새 List 로 한다.
? LabelledEvaluation of this BreakableStatement
에 newLabelSet 인수를 넘겨 수행한 결과를 반환한다.
14.2 블록
구문
BlockStatement [Yield, Await,
Return] :
Block [?Yield, ?Await,
?Return]
Block [Yield, Await,
Return] :
{
StatementList [?Yield, ?Await,
?Return] opt
}
StatementList [Yield, Await,
Return] :
StatementListItem [?Yield,
?Await, ?Return]
StatementList [?Yield, ?Await,
?Return]
StatementListItem [?Yield,
?Await, ?Return]
StatementListItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
Declaration [?Yield,
?Await]
14.2.1 정적 의미론: 초기 에러
Block :
{
StatementList
}
14.2.2 런타임 의미론: 평가
Block :
{
}
empty 를 반환한다.
Block :
{
StatementList
}
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
blockEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
BlockDeclarationInstantiation (StatementList ,
blockEnv )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 blockEnv 로 설정한다.
blockValue 를 Completion (Evaluation of StatementList )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? blockValue 를 반환한다.
참고 1
어떤 방식으로 Block 에서 벗어나더라도
LexicalEnvironment는 항상 이전 상태로 복원된다.
StatementList :
StatementList
StatementListItem
sl 을 ? Evaluation of StatementList 의 결과로 한다.
s 를 Completion (Evaluation of StatementListItem )의 결과로 한다.
? UpdateEmpty (s , sl )를
반환한다.
참고 2
StatementList 의 값은
StatementList 내 마지막 값
생성 항목의 값이다. 예를 들어, 다음 eval 함수 호출은 모두 1을 반환한다:
eval ("1;;;;;" )
eval ("1;{}" )
eval ("1;var a;" )
14.2.3 BlockDeclarationInstantiation ( code ,
env )
추상 연산 BlockDeclarationInstantiation은 code (파스 노드(Parse
Node) )와 env (선언적 환경 레코드(Declarative Environment
Record) )를 인수로 받고 unused 를 반환한다. code 는
블록의 본문에 해당하는 파스 노드(Parse Node) 이다. env 는 바인딩이
생성될 환경 레코드(Environment Record) 이다.
참고
Block 또는 CaseBlock 이 평가될 때, 새로운
선언적 환경 레코드 가 생성되고, 블록
내 선언된 각 블록 범위 변수, 상수, 함수, 클래스에 대한 바인딩이 환경 레코드 에 인스턴스화된다.
호출 시 다음 단계를 수행한다:
declarations 를 LexicallyScopedDeclarations
of code 로 한다.
privateEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 PrivateEnvironment로 한다.
declarations 의 각 요소 d 에 대해, 다음을 수행한다:
BoundNames of
d 의 각 요소 dn 에 대해, 다음을 수행한다:
IsConstantDeclaration
of d 가 true 이면,
! env .CreateImmutableBinding(dn ,
true )을 수행한다.
그 외에는,
! env .CreateMutableBinding(dn ,
false )을 수행한다. 참고: 이 단계는 B.3.2.6
절에서 대체된다.
d 가 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나라면, 다음을 수행한다:
fn 을 BoundNames
of d 의 유일한 요소로 한다.
fo 를 InstantiateFunctionObject
of d 에 env 와 privateEnv 인수를 넘겨 수행한 결과로
한다.
! env .InitializeBinding(fn , fo )를
수행한다. 참고: 이 단계는 B.3.2.6
절에서 대체된다.
unused 를 반환한다.
14.3 선언과 변수 문
14.3.1 let 및 const 선언
참고
let 및 const 선언은 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment에 스코프를 갖는 변수를 정의한다. 이 변수들은 해당
환경 레코드(Environment Record) 가
인스턴스화될 때 생성되지만, 변수의 LexicalBinding 이 평가되기 전까지는 어떠한 방식으로든 접근할
수 없다. LexicalBinding 이 Initializer 를 포함하는 경우, 해당
변수는 Initializer 의
AssignmentExpression 이 LexicalBinding 이 평가될 때 값을
할당받으며, 변수 생성 시 할당받지 않는다. let 선언 내의 LexicalBinding 에 Initializer 가 없는 경우, 해당 변수는
LexicalBinding 이 평가될
때 undefined 가 할당된다.
구문
LexicalDeclaration [In,
Yield, Await] :
LetOrConst
BindingList [?In, ?Yield,
?Await]
;
LetOrConst :
let
const
BindingList [In, Yield,
Await] :
LexicalBinding [?In,
?Yield, ?Await]
BindingList [?In, ?Yield,
?Await]
,
LexicalBinding [?In,
?Yield, ?Await]
LexicalBinding [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
14.3.1.1 정적 의미론: 초기 에러
LexicalDeclaration
:
LetOrConst
BindingList
;
LexicalBinding :
BindingIdentifier
Initializer opt
14.3.1.2 런타임 의미론: 평가
LexicalDeclaration
:
LetOrConst
BindingList
;
? Evaluation of BindingList 를 수행한다.
empty 를 반환한다.
BindingList :
BindingList
,
LexicalBinding
? Evaluation of BindingList 를 수행한다.
? Evaluation of LexicalBinding 을 반환한다.
LexicalBinding :
BindingIdentifier
lhs 를 ! ResolveBinding (StringValue of
BindingIdentifier )로 한다.
! InitializeReferencedBinding (lhs ,
undefined )를 수행한다.
empty 를 반환한다.
참고
정적 의미론 규칙에 의해 이 형태의 LexicalBinding 이
const 선언에 등장하는 일은 없다.
LexicalBinding :
BindingIdentifier
Initializer
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ! ResolveBinding (bindingId )로
한다.
IsAnonymousFunctionDefinition (Initializer )이
true 이면,
value 를 ? NamedEvaluation of Initializer
에 bindingId 인수를 넘겨 수행한 결과로 한다.
그 외에는,
rhs 를 ? Evaluation
of Initializer 의 결과로 한다.
value 를 ? GetValue (rhs )로 한다.
! InitializeReferencedBinding (lhs ,
value )를 수행한다.
empty 를 반환한다.
LexicalBinding :
BindingPattern
Initializer
rhs 를 ? Evaluation of
Initializer 의 결과로
한다.
value 를 ? GetValue (rhs )로 한다.
env 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
? BindingInitialization of BindingPattern 에
value 와 env 를 인수로 넘겨 수행한 결과를 반환한다.
14.3.2 변수 문
참고
var 문은 실행 중인 실행 컨텍스트(running execution
context) 의 VariableEnvironment에 스코프를 갖는 변수를 선언한다. var 변수는 해당
환경 레코드(Environment Record) 가
인스턴스화될 때 생성되고, 생성 시 undefined 로 초기화된다. 어떤 VariableEnvironment의 스코프
내에서는 동일한 BindingIdentifier 가 둘 이상의 VariableDeclaration 에 나타날 수 있으나, 이
선언들은 모여 하나의 변수만 정의한다. VariableDeclaration 이 Initializer 를 포함하는 경우, 해당
변수는 Initializer 의
AssignmentExpression 이 VariableDeclaration 이 실행될 때 값을
할당받으며, 변수 생성 시 할당받지 않는다.
구문
VariableStatement [Yield,
Await] :
var
VariableDeclarationList [+In,
?Yield, ?Await]
;
VariableDeclarationList [In,
Yield, Await] :
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclarationList [?In,
?Yield, ?Await]
,
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclaration [In,
Yield, Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
14.3.2.1 런타임 의미론: 평가
VariableStatement
:
var
VariableDeclarationList
;
? Evaluation of VariableDeclarationList 를
수행한다.
empty 를 반환한다.
VariableDeclarationList
:
VariableDeclarationList
,
VariableDeclaration
? Evaluation of VariableDeclarationList 를
수행한다.
? Evaluation of VariableDeclaration 을 반환한다.
VariableDeclaration
: BindingIdentifier
empty 를 반환한다.
VariableDeclaration
:
BindingIdentifier
Initializer
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ? ResolveBinding (bindingId )로 한다.
IsAnonymousFunctionDefinition (Initializer )가
true 이면,
value 를 ? NamedEvaluation of Initializer
에 bindingId 인수를 넘겨 수행한 결과로 한다.
그 외에는,
rhs 를 ? Evaluation
of Initializer 의 결과로 한다.
value 를 ? GetValue (rhs )로 한다.
? PutValue (lhs ,
value )를 수행한다.
empty 를 반환한다.
참고
VariableDeclaration 이 with 문
내부에 중첩되어 있고 해당 BindingIdentifier 가 with 문의 바인딩
객체의 프로퍼티
이름(property name) 과 같으면, 5 단계는
VariableEnvironment 바인딩 대신 프로퍼티에 value 를 할당한다.
VariableDeclaration
:
BindingPattern
Initializer
rhs 를 ? Evaluation of
Initializer 의 결과로
한다.
rVal 을 ? GetValue (rhs )로 한다.
? BindingInitialization of BindingPattern 에
rVal 및 undefined 를 인수로 넘겨 수행한 결과를 반환한다.
14.3.3 구조 분해 바인딩 패턴
구문
BindingPattern [Yield,
Await] :
ObjectBindingPattern [?Yield,
?Await]
ArrayBindingPattern [?Yield,
?Await]
ObjectBindingPattern [Yield,
Await] :
{
}
{
BindingRestProperty [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
,
BindingRestProperty [?Yield,
?Await] opt
}
ArrayBindingPattern [Yield,
Await] :
[
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
[
BindingElementList [?Yield,
?Await]
]
[
BindingElementList [?Yield,
?Await]
,
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
BindingRestProperty [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
BindingPropertyList [Yield,
Await] :
BindingProperty [?Yield,
?Await]
BindingPropertyList [?Yield,
?Await]
,
BindingProperty [?Yield,
?Await]
BindingElementList [Yield,
Await] :
BindingElisionElement [?Yield,
?Await]
BindingElementList [?Yield,
?Await]
,
BindingElisionElement [?Yield,
?Await]
BindingElisionElement [Yield,
Await] :
Elision opt
BindingElement [?Yield,
?Await]
BindingProperty [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
BindingElement [?Yield,
?Await]
BindingElement [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
SingleNameBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
BindingRestElement [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
...
BindingPattern [?Yield,
?Await]
14.3.3.1 런타임 의미론: PropertyBindingInitialization
구문 지시 연산
PropertyBindingInitialization은 value (ECMAScript 언어 값 )과
environment (환경 레코드(Environment Record) 또는
undefined )를 인수로 받고, 정상 완료(normal
completion) 로 List (모든
바인딩된 프로퍼티 키의 리스트) 또는 비정상 완료(abrupt
completion) 를 반환한다. 모든 바인딩된 프로퍼티 이름의 리스트를 수집한다. 다음 생성식에 대해 조각별로 정의된다:
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
boundNames 를 ? PropertyBindingInitialization of BindingPropertyList 에
value 와 environment 를 인수로 넘겨 수행한 결과로 한다.
nextNames 를 ? PropertyBindingInitialization of BindingProperty
에 value 와 environment 를 인수로 넘겨 수행한 결과로 한다.
boundNames 와 nextNames 의 리스트
연결(list-concatenation) 결과를 반환한다.
BindingProperty
: SingleNameBinding
name 을 BoundNames of SingleNameBinding 의 유일한 요소로 한다.
? KeyedBindingInitialization of SingleNameBinding
에 value , environment , name 을 인수로 넘겨 수행한다.
« name »를 반환한다.
BindingProperty
:
PropertyName
:
BindingElement
P 를 ? Evaluation of
PropertyName 의 결과로
한다.
? KeyedBindingInitialization of BindingElement 에
value , environment , P 를 인수로 넘겨 수행한다.
« P »를 반환한다.
14.3.3.2 런타임 의미론: RestBindingInitialization
구문 지시 연산
RestBindingInitialization은 value
(ECMAScript 언어 값 ),
environment (환경 레코드(Environment Record) 또는
undefined ), excludedNames (List 타입의 프로퍼티 키 리스트)를
인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
BindingRestProperty
:
...
BindingIdentifier
lhs 를 ? ResolveBinding (StringValue of
BindingIdentifier ,
environment )로 한다.
restObj 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
? CopyDataProperties (restObj ,
value , excludedNames )를 수행한다.
environment 가 undefined 이면, ? PutValue (lhs ,
restObj )를 반환한다.
? InitializeReferencedBinding (lhs ,
restObj )를 반환한다.
14.3.3.3 런타임 의미론: KeyedBindingInitialization
구문 지시 연산
KeyedBindingInitialization은 value
(ECMAScript 언어 값 ),
environment (환경 레코드(Environment Record) 또는
undefined ), propertyName (프로퍼티 키 )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
참고
environment 에 undefined 가 전달되는 경우, 초기화 값을 할당하기 위해
PutValue 연산을 사용해야 함을 나타낸다. 이는 비엄격
함수(non-strict functions) 의 형식적 매개변수 리스트의 경우이다. 이런 경우, 동일한 이름의
여러 매개변수가 있을 수 있으므로 형식적 매개변수 바인딩이 미리 초기화된다.
다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
Initializer opt
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
defaultValue 를 ? Evaluation of Initializer 의
결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
? BindingInitialization of BindingPattern 에
v 와 environment 를 인수로 넘겨 수행한 결과를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer opt
bindingId 를 StringValue of
BindingIdentifier 로 한다.
lhs 를 ? ResolveBinding (bindingId ,
environment )로 한다.
v 를 ? GetV (value ,
propertyName )로 한다.
Initializer 가 존재하고
v 가 undefined 이면,
IsAnonymousFunctionDefinition (Initializer )가
true 이면,
v 를 ? NamedEvaluation of
Initializer 에
bindingId 인수를 넘겨 수행한 결과로 설정한다.
그 외에는,
defaultValue 를 ? Evaluation of Initializer 의 결과로 한다.
v 를 ? GetValue (defaultValue )로
설정한다.
environment 가 undefined 이면, ? PutValue (lhs , v )를
반환한다.
? InitializeReferencedBinding (lhs ,
v )를 반환한다.
14.4 빈 문
구문
EmptyStatement :
;
14.4.1 런타임 의미론: 평가
EmptyStatement :
;
empty 를 반환한다.
14.5 표현식 문
구문
ExpressionStatement [Yield,
Await] :
[lookahead ∉ { { , function , async
[no LineTerminator here]
function , class , let
[ }]
Expression [+In, ?Yield,
?Await]
;
참고
ExpressionStatement 는
U+007B(LEFT CURLY BRACKET)로 시작할 수 없다. 왜냐하면 이는 Block 과 혼동될 수 있기 때문이다. ExpressionStatement 는
function 또는 class 키워드 로 시작할 수 없는데, 이는 FunctionDeclaration ,
GeneratorDeclaration ,
또는 ClassDeclaration 과
혼동될 수 있기 때문이다.
ExpressionStatement 는
async function으로 시작할 수 없는데, 이는 AsyncFunctionDeclaration 또는
AsyncGeneratorDeclaration 과 혼동될 수
있기 때문이다.
ExpressionStatement 는
let [의 두 토큰 시퀀스로 시작할 수 없는데, 이는 LexicalDeclaration 의 첫 LexicalBinding 이 ArrayBindingPattern 인
let 선언과 혼동될 수 있기 때문이다.
14.5.1 런타임 의미론: 평가
ExpressionStatement
:
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
? GetValue (exprRef )를 반환한다.
14.6 if 문
구문
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
[lookahead ≠ else ]
참고
lookahead 제한 [lookahead ≠ else]는 고전적인 "dangling else" 문제를
일반적인 방식으로 해결한다. 즉, 연관된 if의 선택이 모호할 경우, else는 후보 if들 중 가장
가까운(가장 안쪽의) 것과 연관된다.
14.6.1 정적 의미론: 초기 에러
IfStatement :
if
(
Expression
)
Statement
else
Statement
IfStatement :
if
(
Expression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용해야 한다.
14.6.2 런타임 의미론: 평가
IfStatement :
if
(
Expression
)
Statement
else
Statement
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ToBoolean (? GetValue (exprRef ))의 결과로 한다.
exprValue 가 true 이면,
stmtCompletion 을 Completion (Evaluation of 첫 번째 Statement )의 결과로 한다.
그 외에는,
stmtCompletion 을 Completion (Evaluation of 두 번째 Statement )의 결과로 한다.
? UpdateEmpty (stmtCompletion ,
undefined )를 반환한다.
IfStatement :
if
(
Expression
)
Statement
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ToBoolean (? GetValue (exprRef ))의 결과로 한다.
exprValue 가 false 이면,
undefined 를 반환한다.
그 외에는,
stmtCompletion 을 Completion (Evaluation of Statement )의 결과로 한다.
? UpdateEmpty (stmtCompletion ,
undefined )를 반환한다.
14.7 반복문
구문
IterationStatement [Yield,
Await, Return] :
DoWhileStatement [?Yield,
?Await, ?Return]
WhileStatement [?Yield, ?Await,
?Return]
ForStatement [?Yield, ?Await,
?Return]
ForInOfStatement [?Yield,
?Await, ?Return]
14.7.1 의미론
14.7.1.1 LoopContinues ( completion ,
labelSet )
추상 연산 LoopContinues는 completion (Completion Record )
와 labelSet (문자열 리스트(List of
Strings) )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
completion 이 normal
completion 이면 true 를 반환한다.
completion 이 continue
completion 이 아니면 false 를 반환한다.
completion .[[Target]] 이
empty 이면 true 를 반환한다.
labelSet 이 completion .[[Target]] 을 포함하면
true 를 반환한다.
false 를 반환한다.
참고
14.7.1.2 런타임 의미론: LoopEvaluation
구문 지시 연산
LoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
IterationStatement
: DoWhileStatement
? DoWhileLoopEvaluation of DoWhileStatement
에 labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: WhileStatement
? WhileLoopEvaluation of WhileStatement 에
labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: ForStatement
? ForLoopEvaluation of ForStatement 에
labelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement
: ForInOfStatement
? ForInOfLoopEvaluation of ForInOfStatement
에 labelSet 인수를 넘겨 수행한 결과를 반환한다.
14.7.2 do-while 문
구문
DoWhileStatement [Yield,
Await, Return] :
do
Statement [?Yield, ?Await,
?Return]
while
(
Expression [+In, ?Yield,
?Await]
)
;
14.7.2.1 정적 의미론: 초기 에러
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
14.7.2.2 런타임 의미론: DoWhileLoopEvaluation
구문 지시 연산
DoWhileLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
DoWhileStatement
:
do
Statement
while
(
Expression
)
;
V 를 undefined 로 한다.
반복한다,
stmtResult 를 Completion (Evaluation of Statement )의 결과로
한다.
LoopContinues (stmtResult ,
labelSet )가 false 이면, ? UpdateEmpty (stmtResult ,
V )를 반환한다.
stmtResult .[[Value]] 가
empty 가 아니면, V 에 stmtResult .[[Value]] 를 설정한다.
exprRef 를 ? Evaluation
of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로
한다.
ToBoolean (exprValue )
가 false 이면 V 를 반환한다.
14.7.3 while 문
구문
WhileStatement [Yield, Await,
Return] :
while
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
14.7.3.1 정적 의미론: 초기 에러
WhileStatement :
while
(
Expression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용한다.
14.7.3.2 런타임 의미론: WhileLoopEvaluation
구문 지시 연산
WhileLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
WhileStatement :
while
(
Expression
)
Statement
V 를 undefined 로 한다.
반복한다,
exprRef 를 ? Evaluation
of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로
한다.
ToBoolean (exprValue )
가 false 이면 V 를 반환한다.
stmtResult 를 Completion (Evaluation of Statement )의 결과로
한다.
LoopContinues (stmtResult ,
labelSet )가 false 이면, ? UpdateEmpty (stmtResult ,
V )를 반환한다.
stmtResult .[[Value]] 가
empty 가 아니면, V 에 stmtResult .[[Value]] 를 설정한다.
14.7.4 for 문
구문
ForStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
var
VariableDeclarationList [~In,
?Yield, ?Await]
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
LexicalDeclaration [~In,
?Yield, ?Await]
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
14.7.4.1 정적 의미론: 초기 에러
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
14.7.4.2 런타임 의미론: ForLoopEvaluation
구문 지시 연산
ForLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
첫 번째 Expression 이
존재하면,
exprRef 를 ? Evaluation
of 첫 번째 Expression 의 결과로 한다.
? GetValue (exprRef )를
수행한다.
두 번째 Expression 이
존재하면 test 를 두 번째 Expression 로, 아니면 test 를
empty 로 한다.
세 번째 Expression 이
존재하면 increment 를 세 번째 Expression 로, 아니면 increment 를
empty 로 한다.
? ForBodyEvaluation (test ,
increment , Statement , « »,
labelSet )을 반환한다.
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
? Evaluation of VariableDeclarationList 를
수행한다.
첫 번째 Expression 이
존재하면 test 를 첫 번째 Expression 로, 아니면 test 를
empty 로 한다.
두 번째 Expression 이
존재하면 increment 를 두 번째 Expression 로, 아니면 increment 를
empty 로 한다.
? ForBodyEvaluation (test ,
increment , Statement , « »,
labelSet )을 반환한다.
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
loopEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
isConst 를 IsConstantDeclaration
of LexicalDeclaration 의 결과로 한다.
boundNames 를 BoundNames of LexicalDeclaration 의 결과로 한다.
boundNames 의 각 요소 dn 에 대해, 다음을 수행한다:
isConst 가 true 이면,
! loopEnv .CreateImmutableBinding(dn ,
true )을 수행한다.
그 외에는,
! loopEnv .CreateMutableBinding(dn ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 loopEnv 로 설정한다.
forDcl 을 Completion (Evaluation of LexicalDeclaration )의 결과로 한다.
forDcl 이 비정상 완료(abrupt
completion) 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? forDcl 을 반환한다.
isConst 가 false 이면 perIterationLets 를
boundNames 로, 아니면 perIterationLets 를 비어 있는 List 로 한다.
첫 번째 Expression 이
존재하면 test 를 첫 번째 Expression 로, 아니면 test 를
empty 로 한다.
두 번째 Expression 이
존재하면 increment 를 두 번째 Expression 로, 아니면 increment 를
empty 로 한다.
bodyResult 를 Completion (ForBodyEvaluation (test ,
increment , Statement , perIterationLets ,
labelSet ))의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? bodyResult 를 반환한다.
14.7.4.3 ForBodyEvaluation ( test ,
increment , stmt , perIterationBindings , labelSet
)
추상 연산 ForBodyEvaluation은 test (Expression 파스
노드(Parse Node) 또는 empty ), increment
(Expression 파스
노드(Parse Node) 또는 empty ), stmt
(Statement 파스
노드(Parse Node) ), perIterationBindings (문자열 리스트(List of
Strings) ), labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
V 를 undefined 로 한다.
? CreatePerIterationEnvironment (perIterationBindings )를
수행한다.
반복한다,
test 가 empty 가 아니면,
testRef 를 ? Evaluation of
test 의 결과로 한다.
testValue 를 ? GetValue (testRef )의
결과로 한다.
ToBoolean (testValue )
가 false 이면 V 를 반환한다.
result 를 Completion (Evaluation of stmt )의
결과로 한다.
LoopContinues (result ,
labelSet )가 false 이면, ? UpdateEmpty (result ,
V )를 반환한다.
result .[[Value]] 가
empty 가 아니면, V 에 result .[[Value]] 를 설정한다.
? CreatePerIterationEnvironment (perIterationBindings )를
수행한다.
increment 가 empty 가 아니면,
incRef 를 ? Evaluation of
increment 의 결과로 한다.
? GetValue (incRef )를
수행한다.
14.7.4.4 CreatePerIterationEnvironment (
perIterationBindings )
추상 연산 CreatePerIterationEnvironment는 perIterationBindings (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) unused 또는 throw completion 를
반환한다. 호출 시 다음 단계를 수행한다:
perIterationBindings 에 요소가 하나라도 있으면,
lastIterationEnv 를 실행 중인 실행
컨텍스트(running execution context) 의 LexicalEnvironment로
한다.
outer 를 lastIterationEnv .[[OuterEnv]] 로 한다.
Assert : outer 는
null 이 아니다.
thisIterationEnv 를 NewDeclarativeEnvironment (outer )로
한다.
perIterationBindings 의 각 요소 bn 에 대해, 다음을 수행한다:
! thisIterationEnv .CreateMutableBinding(bn ,
false )를 수행한다.
lastValue 를
? lastIterationEnv .GetBindingValue(bn ,
true )로 한다.
! thisIterationEnv .InitializeBinding(bn ,
lastValue )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를
thisIterationEnv 로 설정한다.
unused 를 반환한다.
14.7.5 for-in,
for-of, 그리고 for-await-of
문
구문
ForInOfStatement [Yield,
Await, Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
ForDeclaration [Yield,
Await] :
LetOrConst
ForBinding [?Yield,
?Await]
ForBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
참고
14.7.5.1 정적 의미론: 초기 에러
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
참고
이 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
ForInOfStatement
:
for
(
ForDeclaration
in
Expression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
14.7.5.2 정적 의미론: IsDestructuring
구문 지시 연산
IsDestructuring은 인수를 받지 않으며 Boolean을 반환한다.
다음 생성식에 대해 조각별로 정의된다:
MemberExpression
: PrimaryExpression
PrimaryExpression 이 ObjectLiteral 또는
ArrayLiteral 인 경우,
true 를 반환한다.
false 를 반환한다.
MemberExpression
:
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression
:
CallExpression
OptionalExpression
false 를 반환한다.
ForDeclaration :
LetOrConst
ForBinding
IsDestructuring
of ForBinding 의 결과를
반환한다.
ForBinding : BindingIdentifier
false 를 반환한다.
ForBinding : BindingPattern
true 를 반환한다.
참고
14.7.5.3 런타임 의미론: ForDeclarationBindingInitialization
구문 지시 연산
ForDeclarationBindingInitialization은 value (ECMAScript 언어 값 )과
environment (환경 레코드(Environment Record) 또는
undefined )를 인수로 받고, 정상 완료(normal
completion) unused 또는 비정상 완료(abrupt
completion) 를 반환한다.
참고
environment 에 undefined 가 전달되면, 초기화 값을 할당하기 위해 PutValue
연산을 사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수(non-strict
functions) 의 형식적 매개변수 리스트의 경우이다( 10.2.11 참조). 이러한
경우, 렉시컬 바인딩이 호이스팅되고 초기화자 평가 전에 미리 초기화된다.
다음 생성식에 대해 조각별로 정의된다:
ForDeclaration :
LetOrConst
ForBinding
? BindingInitialization of ForBinding 에
value 와 environment 를 인수로 넘겨 수행한 결과를 반환한다.
14.7.5.4 런타임 의미론: ForDeclarationBindingInstantiation
구문 지시 연산
ForDeclarationBindingInstantiation은 environment (선언적 환경 레코드(Declarative Environment
Record) )를 인수로 받고 unused 를 반환한다. 다음 생성식에 대해 조각별로
정의된다:
ForDeclaration :
LetOrConst
ForBinding
ForBinding 의
BoundNames 의 각 요소
name 에 대해, 다음을 수행한다:
IsConstantDeclaration
of LetOrConst 이
true 이면,
! environment .CreateImmutableBinding(name ,
true )를 수행한다.
그 외에는,
! environment .CreateMutableBinding(name ,
false )를 수행한다.
unused 를 반환한다.
14.7.5.5 런타임 의미론: ForInOfLoopEvaluation
구문 지시 연산
ForInOfLoopEvaluation은 labelSet (문자열 리스트(List of
Strings) )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다.
다음 생성식에 대해 조각별로 정의된다:
ForInOfStatement
:
for
(
LeftHandSideExpression
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , enumerate ,
assignment , labelSet )을 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , enumerate ,
var-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
ForDeclaration
in
Expression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
Expression ,
enumerate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , enumerate ,
lexical-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , iterate ,
assignment , labelSet )을 반환한다.
ForInOfStatement
:
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , iterate ,
var-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
AssignmentExpression ,
iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , iterate ,
lexical-binding , labelSet )을 반환한다.
ForInOfStatement
:
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (LeftHandSideExpression ,
Statement ,
keyResult , iterate ,
assignment , labelSet ,
async )을 반환한다.
ForInOfStatement
:
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (« », AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForBinding , Statement ,
keyResult , iterate ,
var-binding , labelSet ,
async )을 반환한다.
ForInOfStatement
:
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult 를 ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration ,
AssignmentExpression ,
async-iterate )의 결과로 한다.
? ForIn/OfBodyEvaluation (ForDeclaration ,
Statement ,
keyResult , iterate ,
lexical-binding , labelSet ,
async )을 반환한다.
참고
14.7.5.6 ForIn/OfHeadEvaluation (
uninitializedBoundNames , expr , iterationKind )
추상 연산 ForIn/OfHeadEvaluation은 uninitializedBoundNames (문자열의 리스트(List) ),
expr (Expression
파스
노드(Parse Node) 또는 AssignmentExpression 파스
노드(Parse Node) ), iterationKind
(enumerate , iterate , 또는
async-iterate )를 인수로 받고, 정상 완료(normal
completion) 로 이터레이터 레코드(Iterator Record) 또는
비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
uninitializedBoundNames 가 비어 있지 않으면,
Assert :
uninitializedBoundNames 에 중복 항목이 없어야 한다.
newEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
uninitializedBoundNames 의 각 문자열 name 에 대해,
! newEnv .CreateMutableBinding(name ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 newEnv 로 설정한다.
exprRef 를 Completion (Evaluation of expr )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
exprValue 를 ? GetValue (?
exprRef )의 결과로 한다.
iterationKind 가 enumerate 이면,
exprValue 가 undefined 또는
null 이면,
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
obj 를 ! ToObject (exprValue )로
한다.
iterator 를 EnumerateObjectProperties (obj )의
결과로 한다.
nextMethod 를 ! GetV (iterator ,
"next" )의 결과로 한다.
이터레이터 레코드(Iterator
Record) { [[Iterator]] :
iterator , [[NextMethod]] :
nextMethod , [[Done]] :
false }를 반환한다.
그 외에는,
Assert : iterationKind 는
iterate 또는
async-iterate 이어야 한다.
iterationKind 가 async-iterate 이면
iteratorKind 를 async 로 한다.
그 외에는 iteratorKind 를 sync 로 한다.
Return ? GetIterator (exprValue ,
iteratorKind ).
14.7.5.7 ForIn/OfBodyEvaluation ( lhs ,
stmt , iteratorRecord , iterationKind , lhsKind ,
labelSet [ , iteratorKind ] )
추상 연산 ForIn/OfBodyEvaluation은 lhs (파스 노드(Parse Node) ),
stmt (Statement
파스
노드(Parse Node) ), iteratorRecord (이터레이터
레코드(Iterator Record) ), iterationKind
(enumerate
또는 iterate ), lhsKind (assignment ,
var-binding , 또는 lexical-binding ),
labelSet (문자열의 리스트(List) ), 그리고 선택적 인수
iteratorKind (sync 또는
async )를 인수로 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
iteratorKind 가 주어지지 않았다면, iteratorKind 를
sync 로 설정한다.
oldEnv 를 실행 중인 실행 컨텍스트(running execution
context) 의 LexicalEnvironment로 한다.
V 를 undefined 로 한다.
destructuring 를 IsDestructuring
of lhs 의 결과로 한다.
destructuring 이 true 이고 lhsKind 가
assignment 이면,
Assert : lhs 는 LeftHandSideExpression 이어야
한다.
assignmentPattern 을 lhs 가 cover 하는 AssignmentPattern 으로 한다.
반복한다,
nextResult 를 ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] )의 결과로 한다.
iteratorKind 가 async 이면,
nextResult 를 ? Await (nextResult )의 결과로
설정한다.
nextResult 가 객체가 아니면 ,
TypeError 예외를 발생시킨다.
done 을 ? IteratorComplete (nextResult )의
결과로 한다.
done 이 true 이면 V 를 반환한다.
nextValue 를 ? IteratorValue (nextResult )의
결과로 한다.
lhsKind 가 assignment 또는
var-binding 이면,
destructuring 이 true 이면,
lhsKind 가 assignment 이면,
status 를 Completion (DestructuringAssignmentEvaluation
of assignmentPattern 에
nextValue 인수를 넘겨 수행한 결과)로 한다.
그 외에는,
Assert :
lhsKind 는
var-binding 이어야 한다.
Assert :
lhs 는 ForBinding 이어야
한다.
status 를 Completion (BindingInitialization
of lhs 에 nextValue 와
undefined 를 인수로 넘겨 수행한 결과)로 한다.
그 외에는,
lhsRef 를 Completion (Evaluation of
lhs )의 결과로 한다. (이것은 반복적으로 평가될 수 있다.)
lhsKind 가 assignment 이고
AssignmentTargetType
of lhs 가 web-compat 이면,
ReferenceError 예외를 발생시킨다.
lhsRef 가 비정상
완료 이면,
status 를 lhsRef 로 한다.
그 외에는,
status 를 Completion (PutValue (lhsRef .[[Value]] ,
nextValue ))의 결과로 한다.
그 외에는,
Assert : lhsKind 는
lexical-binding 이어야 한다.
Assert : lhs 는
ForDeclaration 이어야
한다.
iterationEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
ForDeclarationBindingInstantiation
of lhs 에 iterationEnv 인수를 넘겨 수행한다.
실행 중인 실행
컨텍스트 의 LexicalEnvironment를
iterationEnv 로 설정한다.
destructuring 이 true 이면,
status 를 Completion (ForDeclarationBindingInitialization
of lhs 에 nextValue 와
iterationEnv 를 인수로 넘겨 수행한 결과)로 한다.
그 외에는,
Assert :
lhs 는 단일 이름을 바인딩한다.
lhsName 을 BoundNames
of lhs 의 유일한 요소로 한다.
lhsRef 를 ! ResolveBinding (lhsName )로
한다.
status 를 Completion (InitializeReferencedBinding (lhsRef ,
nextValue ))의 결과로 한다.
status 가 비정상
완료 이면,
실행 중인 실행
컨텍스트 의 LexicalEnvironment를
oldEnv 로 설정한다.
iteratorKind 가 async 이면,
? AsyncIteratorClose (iteratorRecord ,
status )를 반환한다.
iterationKind 가 enumerate 이면,
? status 를 반환한다.
그 외에는,
Assert :
iterationKind 는 iterate 이어야
한다.
? IteratorClose (iteratorRecord ,
status )를 반환한다.
result 를 Completion (Evaluation of stmt )의
결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
LoopContinues (result ,
labelSet )이 false 이면,
iterationKind 가 enumerate 이면,
? UpdateEmpty (result ,
V )를 반환한다.
그 외에는,
Assert :
iterationKind 는 iterate 이어야
한다.
status 를 Completion (UpdateEmpty (result ,
V ))의 결과로 한다.
iteratorKind 가 async 이면,
? AsyncIteratorClose (iteratorRecord ,
status )를 반환한다.
? IteratorClose (iteratorRecord ,
status )를 반환한다.
result .[[Value]] 가
empty 가 아니면, V 에 result .[[Value]] 를 설정한다.
14.7.5.8 런타임 의미론: 평가
BindingIdentifier
:
Identifier
yield
await
bindingId 를 BindingIdentifier 의 StringValue 로 한다.
? ResolveBinding (bindingId )를
반환한다.
14.7.5.9 EnumerateObjectProperties ( O )
추상 연산 EnumerateObjectProperties는 인수 O (객체)를 받고, 이터레이터
객체(iterator object) 를 반환한다. 호출 시 다음 단계를 수행한다:
이터레이터 객체 를 반환한다. 이 객체의
next 메서드는 O 의 열거 가능한 프로퍼티의 모든 문자열 키를 순회한다. 이터레이터 객체 는 ECMAScript 코드에서 직접
접근할 수 없다. 프로퍼티 열거의 메커니즘과 순서는 명시되어 있지 않지만, 아래 명시된 규칙을 따라야 한다.
이터레이터 의 throw 및
return 메서드는 null 이며, 호출되지 않는다. 이터레이터 의 next 메서드는 객체의
프로퍼티가 프로퍼티
키 로 반환되어야 하는지 판별한다. 반환되는 프로퍼티 키 에는 심볼(Symbol) 키가 포함되지 않는다.
대상 객체의 프로퍼티는 열거 도중 삭제될 수 있다. 이터레이터 의 next 메서드가 처리하기 전에
삭제된 프로퍼티는 무시된다. 열거 도중 새 프로퍼티가 추가된 경우, 새로 추가된 프로퍼티가 반드시 열거될 필요는 없다. 프로퍼티 이름 은 어떤
열거에서도 이터레이터 의 next 메서드에서 최대 한 번만
반환된다.
대상 객체의 프로퍼티를 열거할 때, 프로토타입, 프로토타입의 프로토타입 등도 재귀적으로 열거 대상에 포함된다. 단, 프로토타입의 프로퍼티가 이터레이터 의 next 메서드에 의해 이미
처리된 이름과 같은 경우는 건너뛴다. 프로토타입 객체의 [[Enumerable]] 속성 값은 이미 처리된 프로퍼티 판정에
고려되지 않는다. 프로토타입 객체의 열거 가능한 프로퍼티 이름은 EnumerateObjectProperties를 해당 프로토타입 객체에 대해 호출하여 얻어야 한다.
EnumerateObjectProperties는 대상 객체의 [[OwnPropertyKeys]] 내부 메서드를 호출하여
자신의 프로퍼티
키 를 얻어야 한다. 프로퍼티 속성 정보는 [[GetOwnProperty]] 내부
메서드를 호출하여 얻어야 한다.
또한 O 나 그 프로토타입 체인의 어떤 객체도 프록시 이색 객체(Proxy exotic object) , TypedArray ,
모듈 네임스페이스 이색 객체(module namespace exotic
object) , 또는 구현체가 제공하는 이색 객체(exotic object) 가 아닌 경우,
이터레이터 는 이터레이터 와 동일하게 동작해야 하며, 이는 CreateForInIterator (O )가
반환하는 이터레이터와 동일하다. 단, 다음 조건 중 하나가 발생할 때까지이다:
O 나 그 프로토타입 체인의 객체의 [[Prototype]] 내부 슬롯의 값이 변경됨
O 나 그 프로토타입 체인의 객체에서 프로퍼티가 제거됨
O 의 프로토타입 체인의 객체에 프로퍼티가 추가됨
O 나 그 프로토타입 체인의 객체의 프로퍼티의 [[Enumerable]] 속성 값이 변경됨
참고 1
ECMAScript 구현체는 14.7.5.10.2.1 의
알고리즘을 직접 구현할 필요는 없다. 위 단락의 제약조건이 위반되지 않는 한, 어떤 동작도 이 알고리즘과 다르지 않으면 된다.
아래는 이러한 규칙을 준수하는 ECMAScript generator 함수의 정보적 정의이다:
function * EnumerateObjectProperties (obj) {
const visited = new Set ();
for (const key of Reflect .ownKeys (obj)) {
if (typeof key === "symbol" ) continue ;
const desc = Reflect .getOwnPropertyDescriptor (obj, key);
if (desc) {
visited.add (key);
if (desc.enumerable ) yield key;
}
}
const proto = Reflect .getPrototypeOf (obj);
if (proto === null ) return ;
for (const protoKey of EnumerateObjectProperties (proto)) {
if (!visited.has (protoKey)) yield protoKey;
}
}
참고 2
이색 객체(exotic
objects) 의 목록은, 구현체들이 전통적으로 이러한 경우에 대해 동작이 달랐고, 다른 경우에는 일치한다는 점에
근거하여 결정되었다. 이 경우에는
CreateForInIterator 와의 일치가 요구되지
않는다.
14.7.5.10 for-in 이터레이터 객체
for-in
이터레이터 는 특정 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. for-in 이터레이터 객체는 ECMAScript 코드에서 직접
접근할 수 없으며, EnumerateObjectProperties 의
동작을 설명하기 위한 목적으로만 존재한다.
14.7.5.10.1 CreateForInIterator ( object )
추상 연산 CreateForInIterator는 인수 object (객체)를 받고, for-in 이터레이터 를 반환한다. 이 연산은
object 의 자신의 및 상속받은 열거 가능한 문자열 프로퍼티를 특정 순서로 순회하는 for-in 이터레이터 객체 를 생성한다. 호출 시
다음 단계를 수행한다:
iterator 를 OrdinaryObjectCreate (%ForInIteratorPrototype% ,
« [[Object]] , [[ObjectWasVisited]] , [[VisitedKeys]] , [[RemainingKeys]] »)로 한다.
iterator .[[Object]] 에
object 를 설정한다.
iterator .[[ObjectWasVisited]] 에
false 를 설정한다.
iterator .[[VisitedKeys]] 에 새로운 빈 리스트(List) 를
설정한다.
iterator .[[RemainingKeys]] 에 새로운 빈 리스트(List) 를
설정한다.
iterator 를 반환한다.
14.7.5.10.2 %ForInIteratorPrototype% 객체
%ForInIteratorPrototype% 객체:
14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )
O 를 this 값으로 한다.
Assert : O 는 객체 이다.
Assert : O 는 for-in 이터레이터
인스턴스의 모든 내부 슬롯을 가진다 (14.7.5.10.3 ).
object 를 O .[[Object]] 로 한다.
반복한다,
O .[[ObjectWasVisited]] 가
false 이면,
keys 를 ? object .[[OwnPropertyKeys]] () 로
한다.
keys 의 각 요소 key 에 대해,
key 가 문자열(String) 이면,
key 를 O .[[RemainingKeys]] 에
추가한다.
O .[[ObjectWasVisited]] 에
true 를 설정한다.
O .[[RemainingKeys]] 가 비어있지 않은 동안
반복한다,
r 을 O .[[RemainingKeys]] 의 첫 번째 요소로 한다.
O .[[RemainingKeys]] 의 첫
번째 요소를 제거한다.
O .[[VisitedKeys]] 에
r 이 없다면,
desc 를 ? object .[[GetOwnProperty]] (r )로
한다.
desc 가
undefined 가 아니면,
r 을 O .[[VisitedKeys]] 에
추가한다.
desc .[[Enumerable]] 가
true 이면, CreateIteratorResultObject (r ,
false )를 반환한다.
object 를 ? object .[[GetPrototypeOf]] () 로 한다.
O .[[Object]] 에
object 를 설정한다.
O .[[ObjectWasVisited]] 에
false 를 설정한다.
object 가 null 이면, CreateIteratorResultObject (undefined ,
true )를 반환한다.
14.7.5.10.3 for-in 이터레이터 인스턴스의 프로퍼티
for-in 이터레이터 인스턴스는 일반 객체(ordinary
objects) 이며, %ForInIteratorPrototype%
내재 객체를 상속한다. for-in 이터레이터 인스턴스는 표 38 에 나열된 내부 슬롯으로
생성된다.
표 38: for-in 이터레이터
인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[Object]]
객체
반복 대상이 되는 객체 값.
[[ObjectWasVisited]]
불리언(Boolean)
true 이면 이터레이터 가 [[Object]] 에서 [[OwnPropertyKeys]] 를 호출한 적이 있고, 그렇지 않으면
false 이다.
[[VisitedKeys]]
문자열의 리스트(List)
현재까지 이 이터레이터 에서 반환한
값들.
[[RemainingKeys]]
문자열의 리스트(List)
현재 객체에서 프로토타입의 프로퍼티(프로토타입이 null 이 아닌 경우)로 넘어가기 전에
반환해야 할 값들.
14.8 continue 문
구문
ContinueStatement [Yield,
Await] :
continue
;
continue
[여기에 LineTerminator 가 없음]
LabelIdentifier [?Yield,
?Await]
;
14.8.1 정적 의미론: 초기 에러
ContinueStatement
:
continue
;
continue
LabelIdentifier
;
14.8.2 런타임 의미론: 평가
ContinueStatement
:
continue
;
Completion
Record { [[Type]] :
continue , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
ContinueStatement
:
continue
LabelIdentifier
;
label 을 LabelIdentifier 의 StringValue 로 한다.
Completion
Record { [[Type]] :
continue , [[Value]] :
empty , [[Target]] :
label }를 반환한다.
14.9 break 문
구문
BreakStatement [Yield,
Await] :
break
;
break
[여기에 LineTerminator 가 없음]
LabelIdentifier [?Yield,
?Await]
;
14.9.1 정적 의미론: 초기 에러
BreakStatement :
break
;
14.9.2 런타임 의미론: 평가
BreakStatement :
break
;
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
empty }를 반환한다.
BreakStatement :
break
LabelIdentifier
;
label 을 LabelIdentifier 의 StringValue 로 한다.
Completion
Record { [[Type]] :
break , [[Value]] :
empty , [[Target]] :
label }를 반환한다.
14.10 return 문
구문
ReturnStatement [Yield,
Await] :
return
;
return
[여기에 LineTerminator 가 없음]
Expression [+In, ?Yield,
?Await]
;
참고
return 문은 함수의 실행을 중단시키고, 대부분의 경우 호출자에게 값을 반환한다. Expression 이 생략되면 반환 값은
undefined 이다. 그렇지 않으면 반환 값은 Expression 의 값이다. return 문은 주변 문맥에
따라 실제로는 호출자에게 값을 반환하지 않을 수도 있다. 예를 들어 try 블록에서 return
문이 실행될 때는 Completion Record 가
finally 블록 평가 중에 다른 Completion
Record 로 대체될 수 있다.
14.10.1 런타임 의미론: 평가
ReturnStatement :
return
;
ReturnCompletion (undefined )를
반환한다.
ReturnStatement :
return
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
GetGeneratorKind ()가
async 이면 exprValue 를 ? Await (exprValue )의 결과로 한다.
ReturnCompletion (exprValue )를
반환한다.
14.11 with 문
참고 1
레거시 with 문의 사용은 새로운 ECMAScript
코드에서 지양해야 한다. 엄격 모드 코드 와 비엄격 코드
모두에서 허용되는 구조 분해 할당 과 같은 대안을 고려하라.
구문
WithStatement [Yield, Await,
Return] :
with
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
참고 2
with 문은 계산된 객체에 대한 객체 환경 레코드 를
실행 중인 실행 컨텍스트 의 렉시컬 환경에 추가한다. 그런 다음
이 확장된 렉시컬 환경을 사용하여 문을 실행한다. 마지막으로 원래의 렉시컬 환경으로 복원한다.
14.11.1 정적 의미론: 초기 에러
WithStatement :
with
(
Expression
)
Statement
참고
두 번째 규칙은 B.3.1 에 명시된 확장이 구현된
경우에만 적용된다.
14.11.2 런타임 의미론: 평가
WithStatement :
with
(
Expression
)
Statement
val 을 ? Evaluation of Expression 의 결과로 한다.
obj 를 ? ToObject (? GetValue (val ))의 결과로 한다.
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
newEnv 를 NewObjectEnvironment (obj ,
true , oldEnv )로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 newEnv 로 설정한다.
C 를 Completion (Evaluation of Statement )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? UpdateEmpty (C ,
undefined )를 반환한다.
참고
내포된 Statement 를 정상적으로 또는
비정상 완료 나 예외로
벗어나더라도, 렉시컬 환경은 항상 원래 상태로 복원된다.
14.12 switch 문
구문
SwitchStatement [Yield, Await,
Return] :
switch
(
Expression [+In, ?Yield,
?Await]
)
CaseBlock [?Yield, ?Await,
?Return]
CaseBlock [Yield, Await,
Return] :
{
CaseClauses [?Yield, ?Await,
?Return] opt
}
{
CaseClauses [?Yield, ?Await,
?Return] opt
DefaultClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return] opt
}
CaseClauses [Yield, Await,
Return] :
CaseClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return]
CaseClause [?Yield, ?Await,
?Return]
CaseClause [Yield, Await,
Return] :
case
Expression [+In, ?Yield,
?Await]
:
StatementList [?Yield, ?Await,
?Return] opt
DefaultClause [Yield, Await,
Return] :
default
:
StatementList [?Yield, ?Await,
?Return] opt
14.12.1 정적 의미론: 초기 에러
SwitchStatement :
switch
(
Expression
)
CaseBlock
14.12.2 런타임 의미론: CaseBlockEvaluation
구문 지시 연산
CaseBlockEvaluation은 인수 input (ECMAScript 언어 값 )을 받고,
정상 완료 로 ECMAScript 언어 값 또는 비정상 완료 를 반환한다. 다음 생성식에 대해
조각별로 정의된다:
CaseBlock :
{
}
undefined 를 반환한다.
CaseBlock :
{
CaseClauses
}
V 를 undefined 로 한다.
A 를 CaseClauses 의 CaseClause 항목들의 소스 텍스트 순서 리스트 로 한다.
found 를 false 로 한다.
A 의 각 CaseClause C 에 대해, 다음을 수행한다:
found 가 false 이면,
found 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
found 가 true 이면,
R 을 Completion (Evaluation of C )의
결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
V 를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
V 를 undefined 로 한다.
첫 번째 CaseClauses 가 존재하면,
A 를 첫 번째 CaseClauses 의 CaseClause 항목들의 소스
텍스트 순서 리스트 로 한다.
그 외에는,
A 를 새로운 빈 리스트 로 한다.
found 를 false 로 한다.
A 의 각 CaseClause C 에 대해, 다음을 수행한다:
found 가 false 이면,
found 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
found 가 true 이면,
R 을 Completion (Evaluation of C )의
결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
foundInB 를 false 로 한다.
두 번째 CaseClauses 가 존재하면,
B 를 두 번째 CaseClauses 의 CaseClause 항목들의 소스
텍스트 순서 리스트 로 한다.
그 외에는,
B 를 새로운 빈 리스트 로 한다.
found 가 false 이면,
B 의 각 CaseClause C 에 대해, 다음을
수행한다:
foundInB 가 false 이면,
foundInB 를 ? CaseClauseIsSelected (C ,
input )의 결과로 설정한다.
foundInB 가 true 이면,
R 을 Completion (Evaluation of CaseClause
C )의 결과로 한다.
R .[[Value]] 가
empty 가 아니면, V 에
R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
foundInB 가 true 이면 V 를 반환한다.
defaultR 을 Completion (Evaluation of DefaultClause )의 결과로 한다.
defaultR .[[Value]] 가 empty 가
아니면, V 에 defaultR .[[Value]] 를 설정한다.
defaultR 이 비정상
완료 이면, ? UpdateEmpty (defaultR ,
V )를 반환한다.
참고: 다음은 두 번째 CaseClauses 의 또 다른 완전 반복이다.
B 의 각 CaseClause C 에 대해, 다음을 수행한다:
R 을 Completion (Evaluation of CaseClause
C )의 결과로 한다.
R .[[Value]] 가 empty 가
아니면, V 에 R .[[Value]] 를 설정한다.
R 이 비정상
완료 이면, ? UpdateEmpty (R ,
V )를 반환한다.
V 를 반환한다.
14.12.3 CaseClauseIsSelected ( C , input )
추상 연산 CaseClauseIsSelected는 인수 C (CaseClause 파스 노드(Parse Node) )와
input (ECMAScript 언어 값 )을 받고, 정상 완료 로 불리언(Boolean) 또는
비정상 완료 를 반환한다. 이 연산은
C 가 input 과 일치하는지 판단한다. 호출 시 다음 단계를 수행한다:
Assert :
C 는 다음 생성식의 인스턴스이다:
CaseClause :
case
Expression
:
StatementList opt
.
exprRef 를 C 의 Expression 에 대해 ? Evaluation 의 결과로 한다.
clauseSelector 를 ? GetValue (exprRef )의 결과로 한다.
IsStrictlyEqual (input ,
clauseSelector )를 반환한다.
참고
이 연산은 C 의 StatementList (있는 경우)를 실행하지 않는다. CaseBlock 알고리즘은 이 반환 값을 사용하여
어느 StatementList 부터
실행을 시작할지 결정한다.
14.12.4 런타임 의미론: 평가
SwitchStatement :
switch
(
Expression
)
CaseBlock
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
switchValue 를 ? GetValue (exprRef )의 결과로 한다.
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
blockEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
BlockDeclarationInstantiation (CaseBlock ,
blockEnv )를 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 blockEnv 로 설정한다.
R 을 Completion (CaseBlockEvaluation of CaseBlock 에
switchValue 인수를 넘겨 수행한 결과)로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
R 을 반환한다.
참고
SwitchStatement 에서
제어가 어떻게 빠져나가든, LexicalEnvironment는 항상 원래 상태로 복원된다.
CaseClause :
case
Expression
:
empty 를 반환한다.
CaseClause :
case
Expression
:
StatementList
? Evaluation of StatementList 의 결과를 반환한다.
DefaultClause :
default
:
empty 를 반환한다.
DefaultClause :
default
:
StatementList
? Evaluation of StatementList 의 결과를 반환한다.
14.13 레이블문
구문
LabelledStatement [Yield, Await,
Return] :
LabelIdentifier [?Yield,
?Await]
:
LabelledItem [?Yield, ?Await,
?Return]
LabelledItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
FunctionDeclaration [?Yield,
?Await, ~Default]
참고
Statement 는 레이블로 접두사를 붙일 수 있다.
레이블문은 레이블이 붙은 break 및 continue 문과 함께 사용할 때만 쓰인다. ECMAScript에는
goto 문이 없다. Statement 는 LabelledStatement 의 일부일 수 있으며, 이는 다시
LabelledStatement 의
일부일 수도 있고, 계속 반복된다. 이렇게 도입된 레이블들은 개별 문들의 의미를 설명할 때 "현재 레이블 집합(current label set)"이라고 한다.
14.13.1 정적 의미론: 초기 에러
LabelledItem : FunctionDeclaration
이 생성식에 의해 소스 텍스트가 매치되면 구문 오류이다.
참고
이 규칙에 대한 대안 정의는 B.3.1 에 제공되어 있다.
14.13.2 정적 의미론: IsLabelledFunction ( stmt )
추상 연산 IsLabelledFunction은 인수 stmt (Statement 파스 노드(Parse Node) )를 받고,
Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
stmt 가 LabelledStatement 가 아니면
false 를 반환한다.
item 을 stmt 의 LabelledItem 로 한다.
item 이
LabelledItem
: FunctionDeclaration
이면 true 를 반환한다.
subStmt 를 item 의 Statement 로 한다.
IsLabelledFunction (subStmt )의
결과를 반환한다.
14.13.3 런타임 의미론: 평가
LabelledStatement
:
LabelIdentifier
:
LabelledItem
? LabelledEvaluation of 이 LabelledStatement
에 인수 « »를 넘겨서 그 결과를 반환한다.
14.13.4 런타임 의미론: LabelledEvaluation
구문 지시 연산
LabelledEvaluation은 인수 labelSet (문자열의 리스트(List) )를 받고, 정상 완료 (ECMAScript 언어 값 또는
empty ) 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
BreakableStatement
: IterationStatement
stmtResult 를 Completion (LoopEvaluation of IterationStatement 에
labelSet 인수를 넘겨서 수행한 결과)로 한다.
stmtResult 가 break 완료(break
completion) 이면,
stmtResult .[[Target]] 가
empty 이면,
stmtResult .[[Value]] 가
empty 이면, stmtResult 를 NormalCompletion (undefined )로
설정한다.
그 외에는, stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
BreakableStatement
: SwitchStatement
stmtResult 를 Completion (Evaluation of SwitchStatement )의 결과로 한다.
stmtResult 가 break 완료(break
completion) 이면,
stmtResult .[[Target]] 가
empty 이면,
stmtResult .[[Value]] 가
empty 이면, stmtResult 를 NormalCompletion (undefined )로
설정한다.
그 외에는, stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
참고 1
LabelledStatement
:
LabelIdentifier
:
LabelledItem
label 을 LabelIdentifier 의 StringValue 로 한다.
newLabelSet 을 labelSet 과 « label »의 리스트
연결(list-concatenation) 로 한다.
stmtResult 를 Completion (LabelledEvaluation of LabelledItem 에
newLabelSet 인수를 넘겨서 수행한 결과)로 한다.
stmtResult 가 break 완료(break
completion) 이고 stmtResult .[[Target]] 가 label 이면,
stmtResult 를 NormalCompletion (stmtResult .[[Value]] )로 설정한다.
? stmtResult 를 반환한다.
LabelledItem : FunctionDeclaration
? Evaluation of FunctionDeclaration 의 결과를 반환한다.
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
? Evaluation of Statement 의 결과를 반환한다.
참고 2
Statement 의 두 가지 생성식만이
LabelledEvaluation에서 특별한 의미를 가진다: BreakableStatement 와 LabelledStatement .
14.14 throw 문
구문
ThrowStatement [Yield,
Await] :
throw
[여기에 LineTerminator 가 없음]
Expression [+In, ?Yield,
?Await]
;
14.14.1 런타임 의미론: 평가
ThrowStatement :
throw
Expression
;
exprRef 를 ? Evaluation of Expression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
ThrowCompletion (exprValue )를
반환한다.
14.15 try 문
구문
TryStatement [Yield, Await,
Return] :
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
Catch [Yield, Await,
Return] :
catch
(
CatchParameter [?Yield,
?Await]
)
Block [?Yield, ?Await,
?Return]
catch
Block [?Yield, ?Await,
?Return]
Finally [Yield, Await,
Return] :
finally
Block [?Yield, ?Await,
?Return]
CatchParameter [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
참고
try 문은 런타임 오류나 throw 문과 같은 예외 상황이 발생할 수 있는 코드 블록을 감싼다.
catch 절은 예외 처리 코드를 제공한다. catch 절이 예외를 포착하면, 그 CatchParameter 가 해당 예외에 바인딩된다.
14.15.1 정적 의미론: 초기 에러
Catch :
catch
(
CatchParameter
)
Block
참고
이 생성식에 대한 대안 정적 의미론 은 B.3.4 에 제시되어 있다.
14.15.2 런타임 의미론: CatchClauseEvaluation
구문 지시 연산
CatchClauseEvaluation은 인수 thrownValue (ECMAScript 언어 값 )을 받고, 정상 완료 (ECMAScript 언어 값 또는
empty ) 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
Catch :
catch
(
CatchParameter
)
Block
oldEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
catchEnv 를 NewDeclarativeEnvironment (oldEnv )로
한다.
CatchParameter 의
BoundNames 의 각 요소
argName 에 대해,
! catchEnv .CreateMutableBinding(argName ,
false )을 수행한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 catchEnv 로 설정한다.
status 를 Completion (BindingInitialization of CatchParameter 에
thrownValue 와 catchEnv 인수를 넘겨서 수행한 결과)로 한다.
status 가 비정상
완료 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? status 를 반환한다.
B 를 Completion (Evaluation of Block )의 결과로 한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 oldEnv 로 설정한다.
? B 를 반환한다.
Catch :
catch
Block
? Evaluation of Block 의 결과를 반환한다.
참고
Block 에서 제어가 어떻게 빠져나가든,
LexicalEnvironment는 항상 원래 상태로 복원된다.
14.15.3 런타임 의미론: 평가
TryStatement :
try
Block
Catch
B 를 Completion (Evaluation of Block )의 결과로 한다.
B 가 throw 완료(throw
completion) 이면, C 를 Completion (CatchClauseEvaluation of Catch 에 B .[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
그 외에는, C 를 B 로 한다.
? UpdateEmpty (C ,
undefined )를 반환한다.
TryStatement :
try
Block
Finally
B 를 Completion (Evaluation of Block )의 결과로 한다.
F 를 Completion (Evaluation of Finally )의 결과로 한다.
F 가 정상 완료(normal
completion) 이면, F 를 B 로 설정한다.
? UpdateEmpty (F ,
undefined )를 반환한다.
TryStatement :
try
Block
Catch
Finally
B 를 Completion (Evaluation of Block )의 결과로 한다.
B 가 throw 완료(throw
completion) 이면, C 를 Completion (CatchClauseEvaluation of Catch 에 B .[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
그 외에는, C 를 B 로 한다.
F 를 Completion (Evaluation of Finally )의 결과로 한다.
F 가 정상 완료(normal
completion) 이면, F 를 C 로 설정한다.
? UpdateEmpty (F ,
undefined )를 반환한다.
14.16 debugger 문
구문
DebuggerStatement :
debugger
;
14.16.1 런타임 의미론: 평가
참고
DebuggerStatement 를
평가하면 구현체가 디버거에서 실행되는 경우 중단점(breakpoint)을 발생시킬 수 있다. 디버거가 없거나 활성화되어 있지 않으면 이 문은 관찰 가능한
효과가 없다.
DebuggerStatement
:
debugger
;
구현 정의 디버깅 기능이 사용 가능하고 활성화된 경우,
구현 정의 디버깅 동작을 수행한다.
새로운 구현 정의
Completion
Record 를 반환한다.
그 외에는,
empty 를 반환한다.
15 ECMAScript 언어: 함수와 클래스
참고
여러 ECMAScript 언어 요소들은 ECMAScript 함수 객체 (10.2 )의 생성을 야기한다. 이러한 함수의
Evaluation 은
[[Call]] 내부 메서드의 실행(10.2.1 )으로
시작한다.
15.1 매개변수 목록
구문
UniqueFormalParameters [Yield,
Await] :
FormalParameters [?Yield,
?Await]
FormalParameters [Yield,
Await] :
[비어 있음]
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameterList [?Yield,
?Await]
,
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [Yield,
Await] :
FormalParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameter [?Yield,
?Await]
FunctionRestParameter [Yield,
Await] :
BindingRestElement [?Yield,
?Await]
FormalParameter [Yield,
Await] :
BindingElement [?Yield,
?Await]
15.1.1 정적 의미론: 초기 에러
UniqueFormalParameters
: FormalParameters
FormalParameters :
FormalParameterList
참고
같은 BindingIdentifier 가 FormalParameterList 에 여러 번 등장하는 것은,
함수가 단순 매개변수 목록을 가지고 있고 엄격 모드 코드 에서 정의되지 않은 경우에만 허용된다.
15.1.2 정적 의미론: ContainsExpression
구문 지시 연산
ContainsExpression은 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ObjectBindingPattern
:
{
}
{
BindingRestProperty
}
false 를 반환한다.
ObjectBindingPattern
:
{
BindingPropertyList
,
BindingRestProperty
}
ContainsExpression
of BindingPropertyList 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
]
false 를 반환한다.
ArrayBindingPattern
:
[
Elision opt
BindingRestElement
]
ContainsExpression
of BindingRestElement 를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
]
ContainsExpression
of BindingElementList 를 반환한다.
ArrayBindingPattern
:
[
BindingElementList
,
Elision opt
BindingRestElement
]
has 를 ContainsExpression
of BindingElementList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingRestElement 를 반환한다.
BindingPropertyList
:
BindingPropertyList
,
BindingProperty
has 를 ContainsExpression
of BindingPropertyList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingProperty 를
반환한다.
BindingElementList
:
BindingElementList
,
BindingElisionElement
has 를 ContainsExpression
of BindingElementList 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingElisionElement 를 반환한다.
BindingElisionElement
:
Elision opt
BindingElement
ContainsExpression
of BindingElement 를
반환한다.
BindingProperty :
PropertyName
:
BindingElement
has 를 IsComputedPropertyKey
of PropertyName 로 한다.
has 가 true 이면 true 를 반환한다.
ContainsExpression
of BindingElement 를
반환한다.
BindingElement :
BindingPattern
Initializer
true 를 반환한다.
SingleNameBinding
: BindingIdentifier
false 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
true 를 반환한다.
BindingRestElement
:
...
BindingIdentifier
false 를 반환한다.
BindingRestElement
:
...
BindingPattern
ContainsExpression
of BindingPattern 를
반환한다.
FormalParameters :
[비어 있음]
false 를 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
ContainsExpression
of FormalParameterList 가
true 이면 true 를 반환한다.
ContainsExpression
of FunctionRestParameter 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
ContainsExpression
of FormalParameterList 가
true 이면 true 를 반환한다.
ContainsExpression
of FormalParameter 를
반환한다.
ArrowParameters :
BindingIdentifier
false 를 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
ContainsExpression
of formals 를 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
false 를 반환한다.
15.1.3 정적 의미론: IsSimpleParameterList
구문 지시 연산
IsSimpleParameterList는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
false 를 반환한다.
BindingElement :
BindingPattern
Initializer
false 를 반환한다.
SingleNameBinding
: BindingIdentifier
true 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
false 를 반환한다.
FormalParameters :
[empty]
true 를 반환한다.
FormalParameters :
FunctionRestParameter
false 를 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
false 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
IsSimpleParameterList
of FormalParameterList 가
false 이면 false 를 반환한다.
IsSimpleParameterList
of FormalParameter 를
반환한다.
FormalParameter :
BindingElement
IsSimpleParameterList
of BindingElement 를
반환한다.
ArrowParameters :
BindingIdentifier
true 를 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
IsSimpleParameterList
of formals 를 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
true 를 반환한다.
CoverCallExpressionAndAsyncArrowHead
:
MemberExpression
Arguments
head 를 AsyncArrowHead 로 한다. 이는 cover 된 CoverCallExpressionAndAsyncArrowHead 에
의해 얻어진다.
IsSimpleParameterList
of head 를 반환한다.
15.1.4 정적 의미론: HasInitializer
구문 지시 연산
HasInitializer는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
BindingElement :
BindingPattern
false 를 반환한다.
BindingElement :
BindingPattern
Initializer
true 를 반환한다.
SingleNameBinding
: BindingIdentifier
false 를 반환한다.
SingleNameBinding
:
BindingIdentifier
Initializer
true 를 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
HasInitializer of
FormalParameterList 가
true 이면 true 를 반환한다.
HasInitializer of
FormalParameter 를
반환한다.
15.1.5 정적 의미론: ExpectedArgumentCount
구문 지시 연산
ExpectedArgumentCount는 인수를 받지 않고 음이 아닌 정수 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FormalParameters :
[비어 있음]
FunctionRestParameter
0을 반환한다.
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList 의 ExpectedArgumentCount 를
반환한다.
참고
FormalParameterList 의
ExpectedArgumentCount는 나머지 매개변수 또는 첫 번째 FormalParameter 가 Initializer를 가진 경우 그
왼쪽에 있는 FormalParameters 의 개수이다. 초기화자가 없는
FormalParameter 가
초기화자를 가진 매개변수 뒤에 오는 것은 허용되지만, 이러한 매개변수는 undefined 를 기본값으로 하는 선택적 매개변수로
간주된다.
FormalParameterList
: FormalParameter
FormalParameter 의
HasInitializer 가
true 이면 0을 반환한다.
1을 반환한다.
FormalParameterList
:
FormalParameterList
,
FormalParameter
count 를 FormalParameterList 의 ExpectedArgumentCount 로
한다.
FormalParameterList 의 HasInitializer 가
true 이거나 FormalParameter 의 HasInitializer 가
true 이면 count 를 반환한다.
count + 1을 반환한다.
ArrowParameters :
BindingIdentifier
1을 반환한다.
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
formals 를 ArrowFormalParameters 로 한다. 이는
cover 된 CoverParenthesizedExpressionAndArrowParameterList 에
의해 얻어진다.
formals 의 ExpectedArgumentCount 를
반환한다.
PropertySetParameterList
: FormalParameter
FormalParameter 의
HasInitializer 가
true 이면 0을 반환한다.
1을 반환한다.
AsyncArrowBindingIdentifier
: BindingIdentifier
1을 반환한다.
15.2 함수 정의
구문
FunctionDeclaration [Yield,
Await, Default] :
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
[+Default]
function
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionBody [Yield,
Await] :
FunctionStatementList [?Yield,
?Await]
FunctionStatementList [Yield,
Await] :
StatementList [?Yield, ?Await,
+Return] opt
15.2.1 정적 의미론: 초기 에러
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
참고
FunctionBody 의 LexicallyDeclaredNames 에는
var 또는 function 선언을 통해 바인딩된 식별자가 포함되지 않는다.
FunctionBody : FunctionStatementList
15.2.2 정적 의미론: FunctionBodyContainsUseStrict
구문 지시 연산
FunctionBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionBody : FunctionStatementList
FunctionBody 의
Directive Prologue 에 Use
Strict Directive 가 포함되어 있으면 true 를 반환하고, 그렇지 않으면
false 를 반환한다.
15.2.3 런타임 의미론: EvaluateFunctionBody
구문 지시 연산
EvaluateFunctionBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, return 완료(return
completion) 또는 throw 완료(throw
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionBody : FunctionStatementList
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
? Evaluation of FunctionStatementList 를 수행한다.
참고: 이전 단계가 정상 완료(normal
completion) 를 반환했다면, FunctionStatementList 의 끝까지 평가가
진행된 것이다.
ReturnCompletion (undefined )를
반환한다.
15.2.4 런타임 의미론: InstantiateOrdinaryFunctionObject
구문 지시 연산
InstantiateOrdinaryFunctionObject는 인수 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )를 수행한다.
MakeConstructor (F )를 수행한다.
F 를 반환한다.
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
MakeConstructor (F )를 수행한다.
F 를 반환한다.
참고
익명 FunctionDeclaration 은
export default 선언의 일부로만 등장할 수 있으며, 그 함수 코드는 항상 엄격 모드
코드(strict mode code) 이다.
15.2.5 런타임 의미론: InstantiateOrdinaryFunctionExpression
구문 지시 연산
InstantiateOrdinaryFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
FunctionExpression
:
function
(
FormalParameters
)
{
FunctionBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
MakeConstructor (closure )를
수행한다.
closure 를 반환한다.
FunctionExpression
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )를 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) FunctionExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , FormalParameters , FunctionBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
MakeConstructor (closure )를
수행한다.
! funcEnv .InitializeBinding(name ,
closure )를 수행한다.
closure 를 반환한다.
참고
15.2.6 런타임 의미론: 평가
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
empty 를 반환한다.
참고 1
FunctionDeclaration
:
function
(
FormalParameters
)
{
FunctionBody
}
empty 를 반환한다.
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionExpression
of FunctionExpression 의 결과를 반환한다.
참고 2
FunctionDeclaration 또는 FunctionExpression 을
사용하여 정의된 모든 함수에는 "prototype" 프로퍼티가 자동으로 생성되어, 해당 함수가 생성자(constructor) 로 사용될 가능성을 허용한다.
FunctionStatementList
: [비어
있음]
undefined 를 반환한다.
15.3 화살표 함수 정의
구문
ArrowFunction [In, Yield,
Await] :
ArrowParameters [?Yield,
?Await]
[여기에 LineTerminator 가 없음]
=>
ConciseBody [?In]
ArrowParameters [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
ConciseBody [In]
:
[선행 기호 ≠ { ]
ExpressionBody [?In,
~Await]
{
FunctionBody [~Yield,
~Await]
}
ExpressionBody [In,
Await] :
AssignmentExpression [?In,
~Yield, ?Await]
보충 구문
다음 생성식의 인스턴스를 처리할 때
ArrowParameters [Yield,
Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList 의
해석은 아래의 문법을 사용하여 정제된다:
ArrowFormalParameters [Yield,
Await] :
(
UniqueFormalParameters [?Yield,
?Await]
)
15.3.1 정적 의미론: 초기 에러
ArrowFunction :
ArrowParameters
=>
ConciseBody
ArrowParameters :
CoverParenthesizedExpressionAndArrowParameterList
15.3.2 정적 의미론: ConciseBodyContainsUseStrict
구문 지시 연산
ConciseBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ConciseBody : ExpressionBody
false 를 반환한다.
ConciseBody :
{
FunctionBody
}
FunctionBodyContainsUseStrict
of FunctionBody 를 반환한다.
15.3.3 런타임 의미론: EvaluateConciseBody
구문 지시 연산
EvaluateConciseBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, return 완료(return
completion) 또는 throw 완료(throw
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ConciseBody : ExpressionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
? Evaluation of ExpressionBody 를 반환한다.
15.3.4 런타임 의미론: InstantiateArrowFunctionExpression
구문 지시 연산
InstantiateArrowFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
ArrowFunction :
ArrowParameters
=>
ConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) ArrowFunction 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , ArrowParameters , ConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
closure 를 반환한다.
참고
ArrowFunction 은
arguments, super, this, new.target에
대한 지역 바인딩을 정의하지 않는다. ArrowFunction 내에서
arguments, super, this, new.target에
대한 참조는 반드시 렉시컬 상위 환경의 바인딩을 참조해야 한다. 일반적으로 이는 바로 상위 함수의 Function Environment가 된다. ArrowFunction 이
super를 포함하더라도, 함수 객체 는 5 단계에서
MakeMethod 를 통해 메서드로 만들어지지 않는다. ArrowFunction 이
super를 참조하는 경우, 반드시 비-ArrowFunction 내에 포함되어 있고, 함수
객체 가 캡처한 env 를 통해 super를 구현하는 데 필요한 상태를 접근할
수 있다.
15.3.5 런타임 의미론: 평가
ArrowFunction :
ArrowParameters
=>
ConciseBody
InstantiateArrowFunctionExpression
of ArrowFunction 의 결과를
반환한다.
ExpressionBody :
AssignmentExpression
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
exprValue 를 ? GetValue (exprRef )의 결과로 한다.
ReturnCompletion (exprValue )를
반환한다.
15.4 메서드 정의
구문
MethodDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
GeneratorMethod [?Yield,
?Await]
AsyncMethod [?Yield,
?Await]
AsyncGeneratorMethod [?Yield,
?Await]
get
ClassElementName [?Yield,
?Await]
(
)
{
FunctionBody [~Yield,
~Await]
}
set
ClassElementName [?Yield,
?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield,
~Await]
}
PropertySetParameterList
:
FormalParameter [~Yield,
~Await]
15.4.1 정적 의미론: 초기 에러
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
15.4.2 정적 의미론: HasDirectSuper
구문 지시 연산
HasDirectSuper는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
FunctionBody Contains SuperCall 의 결과를 반환한다.
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
FunctionBody Contains SuperCall 의 결과를 반환한다.
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
PropertySetParameterList
Contains SuperCall 이
true 이면 true 를 반환한다.
FunctionBody Contains SuperCall 의 결과를 반환한다.
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
GeneratorBody
Contains SuperCall 의 결과를 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
AsyncGeneratorBody Contains SuperCall 의 결과를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
UniqueFormalParameters
Contains SuperCall 이
true 이면 true 를 반환한다.
AsyncFunctionBody
Contains SuperCall 의 결과를 반환한다.
15.4.3 정적 의미론: SpecialMethod
구문 지시 연산
SpecialMethod는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
false 를 반환한다.
MethodDefinition :
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
true 를 반환한다.
15.4.4 런타임 의미론: DefineMethod
구문 지시 연산
DefineMethod는 인수 object (Object)와 선택적 인수 functionPrototype (Object)를 받고,
정상 완료(normal
completion) (Record , 필드
[[Key]] (property key )와 [[Closure]] (ECMAScript 함수 객체 )) 또는 비정상 완료(abrupt
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
functionPrototype 이 존재하면,
prototype 을 functionPrototype 으로 한다.
그 외에는,
prototype 을 %Function.prototype% 로
한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
closure 를 OrdinaryFunctionCreate (prototype ,
sourceText , UniqueFormalParameters , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
Record { [[Key]] : propKey , [[Closure]] : closure }를 반환한다.
15.4.5 런타임 의미론: MethodDefinitionEvaluation
구문 지시 연산
MethodDefinitionEvaluation은 인수 object (Object)와 enumerable (Boolean)을 받고,
정상 완료 (PrivateElement 또는
unused ), 또는 비정상 완료 를
반환한다. 다음 생성식에 대해 조각별로 정의된다:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
methodDef 를 ? DefineMethod of MethodDefinition 에 object
인수를 넘겨서 수행한 결과로 한다.
SetFunctionName (methodDef .[[Closure]] , methodDef .[[Key]] )를 수행한다.
? DefineMethodProperty (object ,
methodDef .[[Key]] , methodDef .[[Closure]] , enumerable )를 반환한다.
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
formalParameterList 를 아래 생성식의 인스턴스로 한다:
FormalParameters
: [비어
있음]
.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameterList , FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey , "get" )를 수행한다.
propKey 가 Private Name 이면,
PrivateElement
{ [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : closure , [[Set]] : undefined }를 반환한다.
그 외에는,
desc 를 PropertyDescriptor { [[Get]] :
closure , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 한다.
? DefinePropertyOrThrow (object ,
propKey , desc )를 수행한다.
unused 를 반환한다.
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) MethodDefinition 로 한다.
closure 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , PropertySetParameterList ,
FunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey , "set" )를 수행한다.
propKey 가 Private Name 이면,
PrivateElement
{ [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : undefined , [[Set]] : closure }를 반환한다.
그 외에는,
desc 를 PropertyDescriptor { [[Set]] :
closure , [[Enumerable]] :
enumerable , [[Configurable]] :
true }로 한다.
? DefinePropertyOrThrow (object ,
propKey , desc )를 수행한다.
unused 를 반환한다.
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , UniqueFormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) AsyncGeneratorMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , UniqueFormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
propKey 를 ? Evaluation of ClassElementName 의 결과로
한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) AsyncMethod 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , UniqueFormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
MakeMethod (closure ,
object )를 수행한다.
SetFunctionName (closure ,
propKey )를 수행한다.
? DefineMethodProperty (object ,
propKey , closure , enumerable )를 반환한다.
15.5 제너레이터 함수 정의
구문
GeneratorDeclaration [Yield,
Await, Default] :
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier [+Yield,
~Await] opt
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield,
Await] :
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield,
~Await]
YieldExpression [In,
Await] :
yield
yield
[여기에 LineTerminator 가 없음]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[여기에 LineTerminator 가 없음]
*
AssignmentExpression [?In,
+Yield, ?Await]
참고 1
yield 바로 뒤의 구문 맥락에서는 InputElementRegExpOrTemplateTail
렉시컬 목표(lexical goal)를 사용해야 한다.
참고 2
YieldExpression 은 제너레이터
함수의 FormalParameters
내에서는 사용할 수 없다. 왜냐하면 FormalParameters 에 포함된 모든 표현식은 Generator가
재개(resumable) 상태가 되기 전에 평가되기 때문이다.
참고 3
15.5.1 정적 의미론: 초기 에러
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
15.5.2 런타임 의미론: EvaluateGeneratorBody
구문 지시 연산
EvaluateGeneratorBody는 인수 functionObject (ECMAScript 함수 객체 )와
argumentsList (List of
ECMAScript 언어 값 )를 받고, throw 완료(throw
completion) 또는 return 완료(return
completion) 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorBody :
FunctionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
G 를 ? OrdinaryCreateFromConstructor (functionObject ,
"%GeneratorPrototype%" , « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] »)의 결과로 한다.
G .[[GeneratorBrand]] 를 empty 로
설정한다.
G .[[GeneratorState]] 를
suspended-start 로 설정한다.
GeneratorStart (G , FunctionBody )를 수행한다.
ReturnCompletion (G )를
반환한다.
15.5.3 런타임 의미론: InstantiateGeneratorFunctionObject
구문 지시 연산
InstantiateGeneratorFunctionObject는 인수 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null )를 받고, ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorDeclaration 로 한다.
F 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
GeneratorDeclaration
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
sourceText 를 GeneratorDeclaration 에 의해
매치된 소스 텍스트(source
text matched by) 로 한다.
F 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
참고
익명 GeneratorDeclaration 은
export default 선언의 일부로만 등장할 수 있으며, 해당 함수 코드는 항상 엄격 모드
코드(strict mode code) 이다.
15.5.4 런타임 의미론: InstantiateGeneratorFunctionExpression
구문 지시 연산
InstantiateGeneratorFunctionExpression은 선택적 인수 name (property key 또는 Private
Name )를 받고 ECMAScript 함수 객체 를 반환한다. 다음 생성식에 대해 조각별로 정의된다:
GeneratorExpression
:
function
*
(
FormalParameters
)
{
GeneratorBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
closure 를 반환한다.
GeneratorExpression
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )를 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 매치된 소스 텍스트(source
text matched by) GeneratorExpression 로 한다.
closure 를 OrdinaryFunctionCreate (%GeneratorFunction.prototype% ,
sourceText , FormalParameters , GeneratorBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )를 수행한다.
prototype 을 OrdinaryObjectCreate (%GeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! funcEnv .InitializeBinding(name ,
closure )를 수행한다.
closure 를 반환한다.
참고
15.5.5 런타임 의미론: 평가
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionExpression
of GeneratorExpression 의 결과를 반환한다.
YieldExpression :
yield
? Yield (undefined )를 반환한다.
YieldExpression :
yield
AssignmentExpression
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
value 를 ? GetValue (exprRef )의 결과로 한다.
? Yield (value )를 반환한다.
YieldExpression :
yield
*
AssignmentExpression
generatorKind 를 GetGeneratorKind ()의 결과로 한다.
Assert :
generatorKind 는 sync 또는 async 이다.
exprRef 를 ? Evaluation of AssignmentExpression 의 결과로 한다.
value 를 ? GetValue (exprRef )의 결과로 한다.
iteratorRecord 를 ? GetIterator (value ,
generatorKind )의 결과로 한다.
iterator 를 iteratorRecord .[[Iterator]] 로
한다.
received 를 NormalCompletion (undefined )로
한다.
반복한다,
received 가 정상
완료(normal completion) 이면,
innerResult 를 ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerResult 를 ? Await (innerResult )의
결과로 설정한다.
innerResult 가 객체가 아니면 ,
TypeError 예외를 던진다.
done 를 ? IteratorComplete (innerResult )의
결과로 한다.
done 이 true 이면,
? IteratorValue (innerResult )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerResult ))로
설정한다.
그 외에 received 가 throw 완료(throw
completion) 이면,
throw 를 ? GetMethod (iterator ,
"throw" )의 결과로 한다.
throw 가 undefined 가 아니면,
innerResult 를 ? Call (throw ,
iterator , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerResult 를 ? Await (innerResult )의
결과로 설정한다.
참고: 내부 iterator
throw 메서드의 예외는 전파된다. 내부 throw 메서드의
정상
완료(normal completion) 는 내부
next와 유사하게 처리된다.
innerResult 가 객체가
아니면 , TypeError 예외를
던진다.
done 를 ? IteratorComplete (innerResult )의
결과로 한다.
done 이 true 이면,
? IteratorValue (innerResult )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerResult ))로
설정한다.
그 외에는,
참고: iterator 에 throw 메서드가 없으면, 이 throw는
yield* 루프를 종료한다. 단, 먼저 iterator 에
정리(clean up) 기회를 준다.
closeCompletion 을 NormalCompletion (empty )로
한다.
generatorKind 가 async 이면, ?
AsyncIteratorClose (iteratorRecord ,
closeCompletion )를 수행한다.
그 외에는, ? IteratorClose (iteratorRecord ,
closeCompletion )를 수행한다.
참고: 다음 단계는 yield* 프로토콜 위반을 나타내기 위해
TypeError 를 던진다: iterator 에
throw 메서드가 없다.
TypeError 예외를 던진다.
그 외에는,
Assert : received 는
return
완료(return completion) 이다.
return 을 ? GetMethod (iterator ,
"return" )의 결과로 한다.
return 이 undefined 이면,
value 를 received .[[Value]] 로 설정한다.
generatorKind 가 async 이면,
value 를 ? Await (value )의
결과로 설정한다.
ReturnCompletion (value )를
반환한다.
innerReturnResult 를 ? Call (return ,
iterator , « received .[[Value]] »)의 결과로 한다.
generatorKind 가 async 이면,
innerReturnResult 를 ? Await (innerReturnResult )의
결과로 설정한다.
innerReturnResult 가 객체가 아니면 ,
TypeError 예외를 던진다.
done 를 ? IteratorComplete (innerReturnResult )의
결과로 한다.
done 이 true 이면,
value 를 ? IteratorValue (innerReturnResult )의
결과로 설정한다.
ReturnCompletion (value )를
반환한다.
generatorKind 가 async 이면,
received 를 Completion (AsyncGeneratorYield (?
IteratorValue (innerReturnResult )))로
설정한다.
그 외에는, received 를 Completion (GeneratorYield (innerReturnResult ))로
설정한다.
15.6 비동기 제너레이터 함수 정의
구문
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[여기에는 LineTerminator 없음]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[여기에는 LineTerminator 없음]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[여기에는 LineTerminator 없음]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[여기에는 LineTerminator 없음]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield,
+Await]
참고 1
YieldExpression 과
AwaitExpression 은
비동기 제너레이터 함수의 FormalParameters 내에서 사용할 수 없습니다. 왜냐하면
FormalParameters 의 일부인
모든 식은
생성된 AsyncGenerator가 재개 가능한 상태가 되기 전에 평가되기 때문입니다.
참고 2
15.6.1 정적 의미론: 초기 에러
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
15.6.2 실행 시 의미론: EvaluateAsyncGeneratorBody
구문 지향 연산
EvaluateAsyncGeneratorBody는
functionObject (ECMAScript 함수 객체 )와 argumentsList (List 타입의 ECMAScript 언어 값 목록) 인자를 받고,
throw completion 또는
return completion 을
반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorBody
: FunctionBody
? FunctionDeclarationInstantiation (functionObject ,
argumentsList )를 수행한다.
generator 를 ? OrdinaryCreateFromConstructor (functionObject ,
"%AsyncGeneratorPrototype%" , « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] »)로 한다.
generator .[[GeneratorBrand]] 를
empty 로 설정한다.
generator .[[AsyncGeneratorState]] 를
suspended-start 로 설정한다.
AsyncGeneratorStart (generator ,
FunctionBody )를 수행한다.
ReturnCompletion (generator )를
반환한다.
15.6.3 실행 시 의미론: InstantiateAsyncGeneratorFunctionObject
구문 지향 연산
InstantiateAsyncGeneratorFunctionObject는
env (Environment Record 타입)와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
name 을 StringValue of BindingIdentifier 로
한다.
sourceText 를 AsyncGeneratorDeclaration에
매치된 소스 텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
AsyncGeneratorDeclaration
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
sourceText 를 AsyncGeneratorDeclaration에
매치된 소스 텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
F 를 반환한다.
참고
익명 AsyncGeneratorDeclaration 은
export default 선언의 일부로만 나타날 수 있습니다.
15.6.4 실행 시 의미론:
InstantiateAsyncGeneratorFunctionExpression
구문 지향 연산
InstantiateAsyncGeneratorFunctionExpression은 선택적 인자 name (프로퍼티 키 또는
Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncGeneratorExpression
:
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncGeneratorExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
closure 를 반환한다.
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
Assert :
name 이 존재하지 않는다.
name 을 StringValue of BindingIdentifier 로
설정한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )을 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncGeneratorExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% ,
sourceText , FormalParameters , AsyncGeneratorBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
prototype 을 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
한다.
! DefinePropertyOrThrow (closure ,
"prototype" , PropertyDescriptor { [[Value]] :
prototype , [[Writable]] : true ,
[[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
! funcEnv .InitializeBinding(name ,
closure )을 수행한다.
closure 를 반환한다.
참고
15.6.5 실행 시 의미론: Evaluation
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionExpression
of AsyncGeneratorExpression 을
반환한다.
15.7 클래스 정의
구문
ClassDeclaration [Yield, Await,
Default] :
class
BindingIdentifier [?Yield,
?Await]
ClassTail [?Yield,
?Await]
[+Default]
class
ClassTail [?Yield,
?Await]
ClassExpression [Yield,
Await] :
class
BindingIdentifier [?Yield,
?Await] opt
ClassTail [?Yield,
?Await]
ClassTail [Yield,
Await] :
ClassHeritage [?Yield,
?Await] opt
{
ClassBody [?Yield,
?Await] opt
}
ClassHeritage [Yield,
Await] :
extends
LeftHandSideExpression [?Yield,
?Await]
ClassBody [Yield,
Await] :
ClassElementList [?Yield,
?Await]
ClassElementList [Yield,
Await] :
ClassElement [?Yield,
?Await]
ClassElementList [?Yield,
?Await]
ClassElement [?Yield,
?Await]
ClassElement [Yield,
Await] :
MethodDefinition [?Yield,
?Await]
static
MethodDefinition [?Yield,
?Await]
FieldDefinition [?Yield,
?Await]
;
static
FieldDefinition [?Yield,
?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
ClassElementName [Yield,
Await] :
PropertyName [?Yield,
?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody
:
ClassStaticBlockStatementList
ClassStaticBlockStatementList
:
StatementList [~Yield, +Await,
~Return] opt
참고
15.7.1 정적 의미론: 초기 에러
ClassTail :
ClassHeritage opt
{
ClassBody
}
ClassBody : ClassElementList
ClassElement : MethodDefinition
ClassElement :
static
MethodDefinition
ClassElement :
FieldDefinition
;
ClassElement :
static
FieldDefinition
;
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName :
PrivateIdentifier
ClassStaticBlockBody
: ClassStaticBlockStatementList
15.7.2 정적 의미론: ClassElementKind
구문 지향 연산
ClassElementKind는 인자를 받지 않으며,
constructor-method , non-constructor-method , 또는
empty 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement : MethodDefinition
MethodDefinition 의
PropName 이
"constructor" 이면,
constructor-method 를 반환한다.
non-constructor-method 를 반환한다.
ClassElement :
static
MethodDefinition
FieldDefinition
;
static
FieldDefinition
;
non-constructor-method 를 반환한다.
ClassElement : ClassStaticBlock
non-constructor-method 를 반환한다.
ClassElement : ;
empty 를 반환한다.
15.7.3 정적 의미론: ConstructorMethod
구문 지향 연산
ConstructorMethod는 인자를 받지 않으며,
ClassElement 파싱
노드 또는 empty 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
ClassElement 의
ClassElementKind 가
constructor-method 이면,
ClassElement 를 반환한다.
empty 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
head 를 ConstructorMethod
of ClassElementList 로 한다.
head 가 empty 가 아니면 head 를 반환한다.
ClassElement 의
ClassElementKind 가
constructor-method 이면,
ClassElement 를 반환한다.
empty 를 반환한다.
참고
초기 에러 규칙은 "constructor" 라는 이름의 메서드 정의가 하나만 존재하며, 접근자
프로퍼티 또는 제너레이터 정의가 아님을 보장합니다.
15.7.4 정적 의미론: IsStatic
구문 지향 연산
IsStatic은 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement : MethodDefinition
false 를 반환한다.
ClassElement :
static
MethodDefinition
true 를 반환한다.
ClassElement :
FieldDefinition
;
false 를 반환한다.
ClassElement :
static
FieldDefinition
;
true 를 반환한다.
ClassElement : ClassStaticBlock
true 를 반환한다.
ClassElement : ;
false 를 반환한다.
15.7.5 정적 의미론: NonConstructorElements
구문 지향 연산
NonConstructorElements는 인자를 받지 않으며,
List 타입의 ClassElement 파싱
노드 목록을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
ClassElement 의
ClassElementKind 가
non-constructor-method 이면,
« ClassElement »를 반환한다.
새로운 빈 List 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
list 를 NonConstructorElements
of ClassElementList 로 한다.
ClassElement 의
ClassElementKind 가
non-constructor-method 이면,
ClassElement 를
list 의 끝에 추가한다.
list 를 반환한다.
15.7.6 정적 의미론: PrototypePropertyNameList
구문 지향 연산
PrototypePropertyNameList는 인자를 받지 않으며,
List 타입의 프로퍼티 키 목록을 반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassElementList :
ClassElement
propName 를 ClassElement 의 PropName 로 한다.
propName 가 empty 이면, 새로운 빈 List 를 반환한다.
ClassElement 의
IsStatic 이
true 이면, 새로운 빈 List 를 반환한다.
« propName »를 반환한다.
ClassElementList :
ClassElementList
ClassElement
list 를 PrototypePropertyNameList
of ClassElementList 로 한다.
propName 를 ClassElement 의 PropName 로 한다.
propName 가 empty 이면 list 를 반환한다.
ClassElement 의
IsStatic 이
true 이면 list 를 반환한다.
list 와 « propName »의 리스트 연결 을 반환한다.
15.7.7 정적 의미론: AllPrivateIdentifiersValid
구문 지향 연산
AllPrivateIdentifiersValid는 names (문자열의 List ) 인자를 받고, Boolean을
반환합니다.
아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 AllPrivateIdentifiersValid의 기본 정의를 갖습니다:
이 파싱 노드 의 각 자식 노드 child 에
대해,
child 가 비터미널의 인스턴스이면,
child 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출 결과가 false 이면,
false 를 반환한다.
true 를 반환한다.
MemberExpression :
MemberExpression
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
MemberExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
CallExpression :
CallExpression
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
CallExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
OptionalChain :
?.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
true 를 반환한다.
false 를 반환한다.
OptionalChain :
OptionalChain
.
PrivateIdentifier
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
OptionalChain 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
ClassBody : ClassElementList
newNames 를 names 와 ClassBody 의 PrivateBoundIdentifiers 의
리스트
연결 로 한다.
ClassElementList 의
AllPrivateIdentifiersValid 에
newNames 인자를 넘겨 호출한 결과를 반환한다.
RelationalExpression
:
PrivateIdentifier
in
ShiftExpression
names 가 PrivateIdentifier 의 StringValue 를 포함하면,
ShiftExpression 의 AllPrivateIdentifiersValid 에
names 인자를 넘겨 호출한 결과를 반환한다.
false 를 반환한다.
15.7.8 정적 의미론: PrivateBoundIdentifiers
구문 지향 연산
PrivateBoundIdentifiers는 인자를 받지 않으며,
문자열의 List 를 반환합니다. 다음 생성식에 대해
개별적으로 정의됩니다:
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName 의
PrivateBoundIdentifiers 를
반환한다.
ClassElementName :
PrivateIdentifier
PrivateIdentifier 의 StringValue 를 유일한 요소로 갖는
List 를 반환한다.
ClassElementName :
PropertyName
ClassElement :
ClassStaticBlock
;
새로운 빈 List 를 반환한다.
ClassElementList :
ClassElementList
ClassElement
names1 를 ClassElementList 의 PrivateBoundIdentifiers 로
한다.
names2 를 ClassElement 의 PrivateBoundIdentifiers 로
한다.
names1 과 names2 의 리스트 연결 을 반환한다.
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName 의
PrivateBoundIdentifiers 를
반환한다.
15.7.9 정적 의미론: ContainsArguments
구문 지향 연산
ContainsArguments는 인자를 받지 않으며, Boolean을 반환합니다.
아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 ContainsArguments의 기본 정의를 갖습니다:
이 파싱 노드 의 각 자식 노드 child 에
대해,
child 가 비터미널의 인스턴스이면,
child 의 ContainsArguments 가
true 이면, true 를 반환한다.
false 를 반환한다.
IdentifierReference
: Identifier
Identifier 의 StringValue 가
"arguments" 이면, true 를 반환한다.
false 를 반환한다.
FunctionDeclaration
:
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression
:
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration
:
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression
:
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration
:
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false 를 반환한다.
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncGeneratorMethod
:
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName 의
ContainsArguments 를
반환한다.
15.7.10 실행 시 의미론: ClassFieldDefinitionEvaluation
구문 지향 연산
ClassFieldDefinitionEvaluation은 homeObject (객체)를 인자로 받고,
내포된 normal completion 에서
ClassFieldDefinition
Record 를 반환하거나,
abrupt completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
FieldDefinition :
ClassElementName
Initializer opt
name 을 ? Evaluation of ClassElementName 로 한다.
Initializer 가 존재하면,
formalParameterList 를 다음 생성식의 인스턴스로 한다:
FormalParameters
: [empty]
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행
컨텍스트 의 PrivateEnvironment로 한다.
sourceText 를 유니코드 코드 포인트의 빈 시퀀스로 한다.
initializer 를 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameterList , Initializer ,
non-lexical-this , env , privateEnv )로
한다.
MakeMethod (initializer ,
homeObject )를 수행한다.
initializer .[[ClassFieldInitializerName]] 를
name 으로 설정한다.
그렇지 않으면,
initializer 를 empty 로 한다.
ClassFieldDefinition
Record { [[Name]] : name , [[Initializer]] : initializer }를 반환한다.
참고
initializer 에 대해 생성된 함수는 ECMAScript 코드에서 직접 접근할 수 없습니다.
15.7.11 실행 시 의미론: ClassStaticBlockDefinitionEvaluation
구문 지향 연산
ClassStaticBlockDefinitionEvaluation은 homeObject (객체)를 인자로 받고,
ClassStaticBlockDefinition
Record 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
lex 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 유니코드 코드 포인트의 빈 시퀀스로 한다.
formalParameters 를 다음 생성식의 인스턴스로 한다:
FormalParameters
: [empty]
bodyFunction 을 OrdinaryFunctionCreate (%Function.prototype% ,
sourceText , formalParameters , ClassStaticBlockBody ,
non-lexical-this , lex , privateEnv )로 한다.
MakeMethod (bodyFunction ,
homeObject )를 수행한다.
ClassStaticBlockDefinition
Record { [[BodyFunction]] :
bodyFunction }을 반환한다.
참고
함수 bodyFunction 은 ECMAScript 코드에서 직접 접근할 수 없습니다.
15.7.12 실행 시 의미론: EvaluateClassStaticBlockBody
구문 지향 연산
EvaluateClassStaticBlockBody는 functionObject (ECMAScript 함수 객체 )를 인자로
받고,
return completion 또는
throw completion 을 반환합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassStaticBlockBody
: ClassStaticBlockStatementList
Assert :
functionObject 는 ClassStaticBlockDefinitionEvaluation
단계 5 에 의해 생성된 합성 함수이다.
! FunctionDeclarationInstantiation (functionObject ,
« »).를 수행한다.
? Evaluation of ClassStaticBlockStatementList 를
수행한다.
ReturnCompletion (undefined )를
반환한다.
15.7.13 실행 시 의미론: ClassElementEvaluation
구문 지향 연산
ClassElementEvaluation은 object (객체)를 인자로 받고,
내포된 normal completion 에서
ClassFieldDefinition
Record ,
ClassStaticBlockDefinition
Record ,
PrivateElement ,
또는 unused 를 반환하거나,
abrupt completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassElement :
FieldDefinition
;
static
FieldDefinition
;
? ClassFieldDefinitionEvaluation of FieldDefinition 에
object 인자를 넘겨 반환한다.
ClassElement :
MethodDefinition
static
MethodDefinition
? MethodDefinitionEvaluation of MethodDefinition 에
object 와 false 인자를 넘겨 반환한다.
ClassElement : ClassStaticBlock
ClassStaticBlockDefinitionEvaluation
of ClassStaticBlock 에 object
인자를 넘겨 반환한다.
ClassElement : ;
unused 를 반환한다.
15.7.14 실행 시 의미론: ClassDefinitionEvaluation
구문 지향 연산
ClassDefinitionEvaluation은 classBinding (문자열 또는 undefined )과
className (프로퍼티
키 또는 Private Name ) 인자를 받고,
내포된 normal completion 에서
함수
객체 를 반환하거나 abrupt
completion 을 반환합니다.
참고
명세의 편의를 위해, private 메서드와 접근자는 클래스 인스턴스의 [[PrivateElements]] 슬롯에
private 필드와 함께 포함되어 있습니다.
그러나 어떤 객체든 주어진 클래스에 의해 정의된 모든 private 메서드와 접근자를 가지거나, 아무것도 가지지 않습니다.
이 기능은 구현이 각 메서드 또는 접근자를 개별적으로 추적할 필요 없이, private 메서드와 접근자를 구현할 수 있도록 설계되었습니다.
예를 들어, 구현체는 인스턴스 private 메서드를 해당 Private Name 에 직접 연결하고,
각 객체에 대해 어떤 클래스 생성자 가 해당 객체를 this 값으로 실행했는지 추적할 수
있습니다.
객체에서 인스턴스 private 메서드를 조회하는 것은, 해당 메서드를 정의한 클래스 생성자 가 객체를 초기화했는지 확인하고,
Private
Name 에 연결된 메서드를 반환하는 것으로 구성됩니다.
이는 private 필드와는 다릅니다: 필드 이니셜라이저가 클래스 인스턴스화 중에 throw될 수 있기 때문에,
개별 객체는 주어진 클래스의 private 필드의 일부만 가질 수 있으므로, private 필드는 일반적으로 개별적으로 추적되어야 합니다.
다음 생성식에 대해 개별적으로 정의됩니다:
ClassTail :
ClassHeritage opt
{
ClassBody opt
}
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
classEnv 를 NewDeclarativeEnvironment (env )로
한다.
classBinding 이 undefined 가 아니면,
! classEnv .CreateImmutableBinding(classBinding ,
true )를 수행한다.
outerPrivateEnvironment 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
classPrivateEnvironment 를 NewPrivateEnvironment (outerPrivateEnvironment )로
한다.
ClassBody 가 존재하면,
ClassBody 의
PrivateBoundIdentifiers 의
각 문자열 dn 에 대해,
classPrivateEnvironment .[[Names]] 에
pn 이라는 Private Name 이 포함되어 있고,
pn .[[Description]] 이 dn 인
경우,
Assert : 이는 getter/setter
쌍에만 해당합니다.
그렇지 않으면,
name 을 dn 을 [[Description]] 으로 하는 새로운 Private Name 로
한다.
name 을 classPrivateEnvironment .[[Names]] 에 추가한다.
ClassHeritage 가 존재하지
않으면,
protoParent 를 %Object.prototype% 로
한다.
constructorParent 를 %Function.prototype% 로
한다.
그렇지 않으면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 classEnv 로 설정한다.
참고: 실행 중인 실행 컨텍스트 의
PrivateEnvironment는 ClassHeritage 평가 시
outerPrivateEnvironment 이다.
superclassRef 를 Completion (Evaluation of ClassHeritage )로
한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
superclass 를 ? GetValue (?
superclassRef )로 한다.
superclass 가 null 이면,
protoParent 를 null 로 한다.
constructorParent 를 %Function.prototype% 로
한다.
그렇지 않고 IsConstructor (superclass )
가 false 이면,
TypeError 예외를 throw한다.
그 밖의 경우,
protoParent 를 ? Get (superclass ,
"prototype" )로 한다.
protoParent 가 객체가 아니거나
null 이 아니라면, TypeError 예외를 throw한다.
constructorParent 를 superclass 로 한다.
proto 를 OrdinaryObjectCreate (protoParent )로
한다.
ClassBody 가 존재하지 않으면
constructor 를 empty 로 한다.
그 밖에는, constructor 를 ClassBody 의 ConstructorMethod 로
한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 classEnv 로 설정한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를 classPrivateEnvironment 로 설정한다.
constructor 가 empty 이면,
defaultConstructor 를 아무 인자도 받지 않고, 캡처하지 않으며, 호출 시 다음 단계를 수행하는 새로운
Abstract Closure 로 한다:
args 를 이 함수에 [[Call]] 또는 [[Construct]] 로 전달된 인자의 List 로
한다.
NewTarget이 undefined 이면, TypeError
예외를 throw한다.
F 를 활성 함수 객체 로 한다.
F .[[ConstructorKind]] 가
derived 이면,
참고: 이 분기는 constructor(...args) { super(...args); }와
비슷하게 동작합니다. 가장 눈에 띄는 차이점은 위 ECMAScript 소스 텍스트가 %Symbol.iterator% 를
%Array.prototype%에서 호출하는 반면,
이 함수는 호출하지 않는다는 점입니다.
func 를 ! F .[[GetPrototypeOf]] ()로 한다.
IsConstructor (func )가
false 이면, TypeError 예외를
throw한다.
result 를 ? Construct (func ,
args , NewTarget)로 한다.
그 밖의 경우,
참고: 이 분기는 constructor() {}와 비슷하게 동작합니다.
result 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%Object.prototype%" )로 한다.
? InitializeInstanceElements (result ,
F )를 수행한다.
NormalCompletion (result )를
반환한다.
F 를 CreateBuiltinFunction (defaultConstructor ,
0, className , « [[ConstructorKind]] , [[SourceText]] », 현재 Realm Record ,
constructorParent )로 한다.
그 밖의 경우,
constructorInfo 를 ! DefineMethod
of constructor 에 proto 와 constructorParent 인자를 넘겨
호출한 결과로 한다.
F 를 constructorInfo .[[Closure]] 로
한다.
MakeClassConstructor (F )를
수행한다.
SetFunctionName (F ,
className )을 수행한다.
MakeConstructor (F ,
false , proto )를 수행한다.
ClassHeritage 가 존재하면
F .[[ConstructorKind]] 를
derived 로 설정한다.
! DefineMethodProperty (proto ,
"constructor" , F , false )를 수행한다.
ClassBody 가 존재하지 않으면
elements 를 새로운 빈 List 로 한다.
그 밖에는, elements 를 ClassBody 의 NonConstructorElements 로
한다.
instancePrivateMethods 를 새로운 빈 List 로 한다.
staticPrivateMethods 를 새로운 빈 List 로 한다.
instanceFields 를 새로운 빈 List 로 한다.
staticElements 를 새로운 빈 List 로 한다.
elements 의 각 ClassElement e 에 대해,
IsStatic of
e 가 false 이면,
element 를 Completion (ClassElementEvaluation of
e 에 proto 인자를 넘겨 호출한 결과)로 한다.
그 밖에는,
element 를 Completion (ClassElementEvaluation of
e 에 F 인자를 넘겨 호출한 결과)로 한다.
element 가 abrupt
completion 이면,
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를
outerPrivateEnvironment 로 설정한다.
? element 를 반환한다.
element 를 ! element 로 설정한다.
element 가 PrivateElement 이면,
Assert : element .[[Kind]] 는 method 또는
accessor 이다.
IsStatic of
e 가 false 이면, container 를
instancePrivateMethods 로 한다.
그 밖에는 container 를 staticPrivateMethods 로 한다.
container 에 element .[[Key]] 와 동일한 pe 라는 PrivateElement 가
포함되어 있다면,
Assert :
element .[[Kind]] 와
pe .[[Kind]] 는 모두
accessor 이다.
element .[[Get]] 이
undefined 이면,
combined 를 PrivateElement
{ [[Key]] :
element .[[Key]] ,
[[Kind]] :
accessor , [[Get]] : pe .[[Get]] , [[Set]] : element .[[Set]] }로 한다.
그 밖에는,
combined 를 PrivateElement
{ [[Key]] :
element .[[Key]] ,
[[Kind]] :
accessor , [[Get]] : element .[[Get]] , [[Set]] : pe .[[Set]] }로 한다.
container 의 pe 를 combined 로 교체한다.
그 밖에는,
element 를 container 에 추가한다.
그 밖에 element 가 ClassFieldDefinition
Record 이면,
IsStatic of
e 가 false 이면, element 를
instanceFields 에 추가한다.
그 밖에는 element 를 staticElements 에 추가한다.
그 밖에 element 가 ClassStaticBlockDefinition
Record 이면,
element 를 staticElements 에 추가한다.
실행 중인 실행 컨텍스트 의
LexicalEnvironment를 env 로 설정한다.
classBinding 이 undefined 가 아니면,
! classEnv .InitializeBinding(classBinding ,
F )를 수행한다.
F .[[PrivateMethods]] 를
instancePrivateMethods 로 설정한다.
F .[[Fields]] 를 instanceFields 로 설정한다.
staticPrivateMethods 의 각 PrivateElement
method 에 대해,
! PrivateMethodOrAccessorAdd (F ,
method )를 수행한다.
staticElements 의 각 elementRecord 에 대해,
elementRecord 가 ClassFieldDefinition
Record 이면,
result 를 Completion (DefineField (F ,
elementRecord ))로 한다.
그 밖에는,
Assert : elementRecord 는
ClassStaticBlockDefinition
Record 이다.
result 를 Completion (Call (elementRecord .[[BodyFunction]] , F ))로 한다.
result 가 abrupt
completion 이면,
실행 중인 실행 컨텍스트 의
PrivateEnvironment를
outerPrivateEnvironment 로 설정한다.
? result 를 반환한다.
실행 중인 실행 컨텍스트 의
PrivateEnvironment를 outerPrivateEnvironment 로 설정한다.
F 를 반환한다.
15.7.15 실행 시 의미론: BindingClassDeclarationEvaluation
구문 지향 연산
BindingClassDeclarationEvaluation은 인자를 받지 않으며,
내포된 normal completion 에서
함수
객체 를 반환하거나 abrupt
completion 을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
ClassDeclaration :
class
BindingIdentifier
ClassTail
className 을 BindingIdentifier 의 StringValue 로 한다.
value 를 ? ClassDefinitionEvaluation of ClassTail 에
className 과 className 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassDeclaration 에 매치된 소스
텍스트 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
? InitializeBoundName (className ,
value , env )를 수행한다.
value 를 반환한다.
ClassDeclaration :
class
ClassTail
value 를 ? ClassDefinitionEvaluation of ClassTail 에
undefined 와 "default" 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassDeclaration 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
참고
ClassDeclaration
:
class
ClassTail
은 ExportDeclaration 의 일부로만 나타나며, 바인딩의
생성은 해당 생성식의 평가 작업의 일부로 처리됩니다. 16.2.3.7 를 참조하세요.
15.7.16 실행 시 의미론: Evaluation
ClassDeclaration :
class
BindingIdentifier
ClassTail
? BindingClassDeclarationEvaluation of this
ClassDeclaration 를
수행한다.
empty 를 반환한다.
참고
ClassExpression :
class
ClassTail
value 를 ? ClassDefinitionEvaluation of ClassTail 에
undefined 와 "" 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassExpression 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
ClassExpression :
class
BindingIdentifier
ClassTail
className 을 BindingIdentifier 의 StringValue 로 한다.
value 를 ? ClassDefinitionEvaluation of ClassTail 에
className 과 className 인자를 넘겨 호출한 결과로 한다.
value .[[SourceText]] 를 ClassExpression 에 매치된 소스
텍스트 로 설정한다.
value 를 반환한다.
ClassElementName :
PrivateIdentifier
privateIdentifier 를 PrivateIdentifier 의 StringValue 로 한다.
privateEnvRec 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
names 를 privateEnvRec .[[Names]] 로 한다.
Assert :
names 의 정확히 한 요소는 [[Description]] 이
privateIdentifier 인 Private Name 이다.
privateName 을 names 에서 [[Description]] 이
privateIdentifier 인 Private Name 로 한다.
privateName 을 반환한다.
ClassStaticBlockStatementList
: [empty]
undefined 를 반환한다.
15.8 비동기 함수 정의
구문
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[여기에는 LineTerminator 없음]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[여기에는 LineTerminator 없음]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[여기에는 LineTerminator 없음]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[여기에는 LineTerminator 없음]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield,
+Await]
AwaitExpression [Yield]
:
await
UnaryExpression [?Yield,
+Await]
참고 1
await는 [Await] 파라미터가 있을 때 AwaitExpression 의 키워드 로 파싱됩니다.
[Await] 파라미터는 다음 컨텍스트의 최상위에서 존재하지만, FunctionBody 등의 일부 컨텍스트에서는 비활성일 수 있습니다:
Script 가 구문적 목표
기호 일 때, [Await] 파라미터가 없으면 await는 식별자로 파싱될 수
있습니다. 다음과 같은 컨텍스트를 포함합니다:
참고 2
YieldExpression 과 달리,
AwaitExpression 의 피연산자를
생략하면 문법 오류입니다. 반드시 await할 대상이 필요합니다.
15.8.1 정적 의미론: 초기 에러
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
15.8.2 실행 시 의미론: InstantiateAsyncFunctionObject
구문 지향 연산
InstantiateAsyncFunctionObject는 env (Environment Record )와
privateEnv (PrivateEnvironment Record 또는
null ) 인자를 받고, ECMAScript 함수 객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionDeclaration
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
name 을 BindingIdentifier 의 StringValue 로 한다.
sourceText 를 AsyncFunctionDeclaration 에 매치된
소스
텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
name )을 수행한다.
F 를 반환한다.
AsyncFunctionDeclaration
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
sourceText 를 AsyncFunctionDeclaration 에 매치된
소스
텍스트 로 한다.
F 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (F ,
"default" )를 수행한다.
F 를 반환한다.
15.8.3 실행 시 의미론: InstantiateAsyncFunctionExpression
구문 지향 연산
InstantiateAsyncFunctionExpression은 선택적 인자 name (프로퍼티 키 또는 Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionExpression
:
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncFunctionExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
AsyncFunctionExpression
:
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
Assert :
name 이 존재하지 않는다.
name 을 BindingIdentifier 의 StringValue 로 설정한다.
outerEnv 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
funcEnv 를 NewDeclarativeEnvironment (outerEnv )로
한다.
! funcEnv .CreateImmutableBinding(name ,
false )을 수행한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncFunctionExpression에
매치된 소스 텍스트 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , FormalParameters , AsyncFunctionBody ,
non-lexical-this , funcEnv , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
! funcEnv .InitializeBinding(name ,
closure )을 수행한다.
closure 를 반환한다.
참고
15.8.4 실행 시 의미론: EvaluateAsyncFunctionBody
구문 지향 연산
EvaluateAsyncFunctionBody는 functionObject (ECMAScript 함수 객체 )와
argumentsList (List 타입의
ECMAScript 언어 값 목록) 인자를 받고,
return completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncFunctionBody
: FunctionBody
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
completion 을 Completion (FunctionDeclarationInstantiation (functionObject ,
argumentsList ))로 한다.
completion 이 abrupt
completion 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
completion .[[Value]] »)를 수행한다.
그 밖에는,
AsyncFunctionStart (promiseCapability ,
FunctionBody )를
수행한다.
ReturnCompletion (promiseCapability .[[Promise]] )를 반환한다.
15.8.5 실행 시 의미론: Evaluation
AsyncFunctionExpression
:
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionExpression
of AsyncFunctionExpression 를 반환한다.
AwaitExpression :
await
UnaryExpression
exprRef 를 ? Evaluation of UnaryExpression 로 한다.
value 를 ? GetValue (exprRef )로 한다.
? Await (value )를 반환한다.
15.9 비동기 화살표 함수 정의
구문
AsyncArrowFunction [In, Yield,
Await] :
async
[여기에는 LineTerminator 없음]
AsyncArrowBindingIdentifier [?Yield]
[여기에는 LineTerminator 없음]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[여기에는 LineTerminator 없음]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
+Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield]
:
BindingIdentifier [?Yield,
+Await]
CoverCallExpressionAndAsyncArrowHead [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
보충 구문
다음 생성식의 인스턴스를 처리할 때
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead 의
해석은 다음 문법을 사용하여 정제됩니다:
AsyncArrowHead :
async
[여기에는 LineTerminator 없음]
ArrowFormalParameters [~Yield,
+Await]
15.9.1 정적 의미론: 초기 에러
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
15.9.2 정적 의미론: AsyncConciseBodyContainsUseStrict
구문 지향 연산
AsyncConciseBodyContainsUseStrict는 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncConciseBody :
ExpressionBody
false 를 반환한다.
AsyncConciseBody :
{
AsyncFunctionBody
}
AsyncFunctionBody 의 FunctionBodyContainsUseStrict 를
반환한다.
15.9.3 실행 시 의미론: EvaluateAsyncConciseBody
구문 지향 연산
EvaluateAsyncConciseBody는 functionObject (ECMAScript 함수 객체 )와
argumentsList (List 타입의
ECMAScript 언어 값 목록) 인자를 받고,
return completion 을
반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncConciseBody :
ExpressionBody
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 한다.
completion 을 Completion (FunctionDeclarationInstantiation (functionObject ,
argumentsList ))로 한다.
completion 이 abrupt
completion 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
completion .[[Value]] »)를 수행한다.
그 밖에는,
AsyncFunctionStart (promiseCapability ,
ExpressionBody )를 수행한다.
ReturnCompletion (promiseCapability .[[Promise]] )를 반환한다.
15.9.4 실행 시 의미론: InstantiateAsyncArrowFunctionExpression
구문 지향 연산
InstantiateAsyncArrowFunctionExpression은 선택적 인자 name (프로퍼티 키 또는 Private
Name )를 받고,
ECMAScript 함수
객체 를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncArrowFunction에
매치된 소스 텍스트 로 한다.
parameters 를 AsyncArrowBindingIdentifier 로
한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , parameters , AsyncConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
AsyncArrowFunction
:
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
name 이 존재하지 않으면 name 을 "" 로 설정한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
privateEnv 를 실행 중인 실행 컨텍스트 의
PrivateEnvironment로 한다.
sourceText 를 AsyncArrowFunction에
매치된 소스 텍스트 로 한다.
head 를 AsyncArrowHead 로 한다. 이는 CoverCallExpressionAndAsyncArrowHead 에
의해 덮여진 것이다.
parameters 를 head 의 ArrowFormalParameters 로 한다.
closure 를 OrdinaryFunctionCreate (%AsyncFunction.prototype% ,
sourceText , parameters , AsyncConciseBody ,
lexical-this , env , privateEnv )로 한다.
SetFunctionName (closure ,
name )을 수행한다.
closure 를 반환한다.
15.9.5 실행 시 의미론: 평가
AsyncArrowFunction
:
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
InstantiateAsyncArrowFunctionExpression
of AsyncArrowFunction 를 반환한다.
15.10 꼬리 위치 호출
15.10.1 정적 의미: IsInTailPosition ( call )
추상 연산 IsInTailPosition은 call ( CallExpression 구문
노드 , MemberExpression 구문
노드 , 또는 OptionalChain 구문
노드 )를 인수로 받아 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:
IsStrict (call )이
false 이면, false 를 반환합니다.
call 이 FunctionBody , ConciseBody , 또는 AsyncConciseBody 에 포함되어 있지 않으면,
false 를 반환합니다.
body 를 FunctionBody , ConciseBody , 또는 AsyncConciseBody 중 call 을
가장 밀접하게 포함하는 것으로 설정합니다.
body 가 FunctionBody 의 GeneratorBody 라면,
false 를 반환합니다.
body 가 FunctionBody 의 AsyncFunctionBody 라면,
false 를 반환합니다.
body 가 FunctionBody 의 AsyncGeneratorBody 라면,
false 를 반환합니다.
body 가 AsyncConciseBody 라면,
false 를 반환합니다.
body 와 인수 call 로 HasCallInTailPosition 의
결과를 반환합니다.
참고
꼬리 위치 호출은 엄격 모드 코드 에서만 정의됩니다. 이는 호출자 컨텍스트 체인의
관찰을 가능하게 하는 일반적인 비표준 언어 확장(10.2.4 )
때문입니다.
15.10.2 정적 의미: HasCallInTailPosition
구문-지향 연산
HasCallInTailPosition은 call ( CallExpression 구문
노드 , MemberExpression 구문
노드 , 또는 OptionalChain 구문
노드 )를 인수로 받아 Boolean을 반환합니다.
참고 1
call 은 특정 소스 텍스트 범위를 나타내는 구문 노드 입니다. 아래 알고리즘이
call 을 다른 구문 노드 와 비교할 때, 이는 동일한 소스 텍스트를 나타내는지
테스트하는 것입니다.
참고 2
반환 GetValue 결과가 즉시 뒤따르는 잠재적 꼬리 위치 호출도 꼬리 위치 호출이
될 수 있습니다. 함수 호출은 참조
레코드 를 반환할 수 없으므로, 이러한 GetValue 연산은 항상 실제 함수 호출 결과와 동일한 값을 반환합니다.
다음 생성 규칙에 따라 개별적으로 정의됩니다:
StatementList :
StatementList
StatementListItem
has 를 HasCallInTailPosition 의
StatementList 와 인수
call 의 결과로 설정한다.
has 가 true 이면, true 를 반환한다.
HasCallInTailPosition 의
StatementListItem 와 인수
call 의 결과를 반환한다.
FunctionStatementList
:
[empty]
StatementListItem
:
Declaration
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block :
{
}
ReturnStatement :
return
;
LabelledItem :
FunctionDeclaration
ForInOfStatement :
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
CaseBlock :
{
}
false 를 반환한다.
IfStatement :
if
(
Expression
)
Statement
else
Statement
has 를 첫 번째 Statement 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 Statement 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
IfStatement :
if
(
Expression
)
Statement
DoWhileStatement :
do
Statement
while
(
Expression
)
;
WhileStatement :
while
(
Expression
)
Statement
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
WithStatement :
with
(
Expression
)
Statement
HasCallInTailPosition 의
Statement 와 인수
call 의 결과를 반환한다.
LabelledStatement
:
LabelIdentifier
:
LabelledItem
HasCallInTailPosition 의
LabelledItem 와 인수
call 의 결과를 반환한다.
ReturnStatement :
return
Expression
;
HasCallInTailPosition 의
Expression 와 인수
call 의 결과를 반환한다.
SwitchStatement :
switch
(
Expression
)
CaseBlock
HasCallInTailPosition 의
CaseBlock 와 인수
call 의 결과를 반환한다.
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
has 를 false 로 설정한다.
첫 번째 CaseClauses 가 존재하면,
has 를 첫 번째 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
has 를 DefaultClause 와 인수 call 로
HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 CaseClauses 가 존재하면,
has 를 두 번째 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 를 반환한다.
CaseClauses :
CaseClauses
CaseClause
has 를 CaseClauses 와 인수 call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
CaseClause 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
CaseClause :
case
Expression
:
StatementList opt
DefaultClause :
default
:
StatementList opt
StatementList 가 존재하면,
HasCallInTailPosition 의
StatementList 와 인수
call 의 결과를 반환한다.
false 를 반환한다.
TryStatement :
try
Block
Catch
HasCallInTailPosition 의
Catch 와 인수 call 의
결과를 반환한다.
TryStatement :
try
Block
Finally
try
Block
Catch
Finally
HasCallInTailPosition 의
Finally 와 인수
call 의 결과를 반환한다.
Catch :
catch
(
CatchParameter
)
Block
HasCallInTailPosition 의
Block 와 인수 call 의
결과를 반환한다.
AssignmentExpression
:
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
BitwiseANDExpression
:
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression
:
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression
:
BitwiseORExpression
|
BitwiseXORExpression
EqualityExpression
:
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
RelationalExpression
:
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
ShiftExpression :
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
AdditiveExpression
:
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
MultiplicativeExpression
:
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
ExponentiationExpression
:
UpdateExpression
**
ExponentiationExpression
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
CallExpression :
SuperCall
ImportCall
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
PrimaryExpression
:
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
false 를 반환한다.
Expression :
AssignmentExpression
Expression
,
AssignmentExpression
HasCallInTailPosition 의
AssignmentExpression 와 인수
call 의 결과를 반환한다.
ConditionalExpression
:
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
has 를 첫 번째 AssignmentExpression 와 인수
call 로 HasCallInTailPosition 의
결과로 설정한다.
has 가 true 이면, true 를 반환한다.
두 번째 AssignmentExpression 와 인수
call 로 HasCallInTailPosition 의
결과를 반환한다.
LogicalANDExpression
:
LogicalANDExpression
&&
BitwiseORExpression
HasCallInTailPosition 의
BitwiseORExpression 와 인수
call 의 결과를 반환한다.
LogicalORExpression
:
LogicalORExpression
||
LogicalANDExpression
HasCallInTailPosition 의
LogicalANDExpression 와 인수
call 의 결과를 반환한다.
CoalesceExpression
:
CoalesceExpressionHead
??
BitwiseORExpression
HasCallInTailPosition 의
BitwiseORExpression 와 인수
call 의 결과를 반환한다.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
CallExpression
TemplateLiteral
이 CallExpression 이
call 이면, true 를 반환한다.
false 를 반환한다.
OptionalExpression
:
MemberExpression
OptionalChain
CallExpression
OptionalChain
OptionalExpression
OptionalChain
HasCallInTailPosition 의
OptionalChain 와 인수
call 의 결과를 반환한다.
OptionalChain :
?.
[
Expression
]
?.
IdentifierName
?.
PrivateIdentifier
OptionalChain
[
Expression
]
OptionalChain
.
IdentifierName
OptionalChain
.
PrivateIdentifier
false 를 반환한다.
OptionalChain :
?.
Arguments
OptionalChain
Arguments
이 OptionalChain 이
call 이면, true 를 반환한다.
false 를 반환한다.
MemberExpression :
MemberExpression
TemplateLiteral
이 MemberExpression 이 call 이면,
true 를 반환한다.
false 를 반환한다.
PrimaryExpression
: CoverParenthesizedExpressionAndArrowParameterList
expr 를 ParenthesizedExpression 에서
covered 된 CoverParenthesizedExpressionAndArrowParameterList 로
설정한다.
HasCallInTailPosition 의
expr 와 인수 call 의 결과를 반환한다.
ParenthesizedExpression
:
(
Expression
)
HasCallInTailPosition 의
Expression 와 인수
call 의 결과를 반환한다.
15.10.3 PrepareForTailCall ( )
추상 연산 PrepareForTailCall은 인수를 받지 않으며 unused 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : 현재
execution context 는 이후 ECMAScript
코드 또는 내장 함수의 평가에 사용되지 않는다.
이 추상 연산 호출 이후의 Call 호출은 그러한 평가를 수행하기 전에 새로운 execution context 를
생성하고 푸시한다.
현재 execution context 와 연관된 모든 리소스를
폐기한다.
unused 를 반환한다.
꼬리 위치 호출은 대상 함수를 호출하기 전에 현재 실행 중인 함수의 execution context 와 연관된 임시 내부 리소스를 해제하거나,
그 리소스를 대상 함수 지원에 재사용해야 한다.
참고
예를 들어, 꼬리 위치 호출은 구현의 activation record 스택을 대상 함수의 activation record 크기가 호출 함수의 activation
record 크기를 초과하는 만큼만 증가시켜야 한다.
만약 대상 함수의 activation record가 더 작다면 전체 스택 크기는 줄어야 한다.
16 ECMAScript 언어: 스크립트와 모듈
16.1 스크립트
구문
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await,
~Return]
16.1.1 정적 의미: 초기 에러
Script : ScriptBody
ScriptBody : StatementList
16.1.2 정적 의미: ScriptIsStrict
구문-지향 연산
ScriptIsStrict는 인수를 받지 않으며 Boolean을 반환한다. 다음 생성 규칙에 따라 개별적으로 정의된다:
Script : ScriptBody opt
ScriptBody 가 존재하고
Directive Prologue 가 Use
Strict Directive 를 포함하면 true 를 반환하고, 그렇지 않으면
false 를 반환한다.
16.1.3 실행 의미: 평가
Script : [empty]
undefined 를 반환한다.
16.1.4 스크립트 레코드
스크립트 레코드 는 평가 중인 스크립트에 대한
정보를 캡슐화한다. 각 스크립트 레코드는 표 39 에 나열된 필드를 포함한다.
표 39: 스크립트 레코드 필드
16.1.5 ParseScript ( sourceText , realm ,
hostDefined )
추상 연산 ParseScript는 sourceText (ECMAScript 소스 텍스트 ), realm (Realm 레코드 ),
hostDefined (아무 값) 인자를 받아 스크립트 레코드 또는 List (비어있지 않은
SyntaxError 객체 목록)을 반환한다. sourceText 를 Script 로 파싱한 결과에 기반하여 스크립트 레코드 를 생성한다. 호출 시 다음 단계를 수행한다:
script 를 ParseText (sourceText , Script )로 설정한다.
script 가 에러의 List 라면
script 를 반환한다.
스크립트
레코드 { [[Realm]] : realm ,
[[ECMAScriptCode]] : script , [[LoadedModules]] : « », [[HostDefined]] : hostDefined }를 반환한다.
참고
구현체는 ParseScript가 실제로 해당 소스 텍스트에 대해 수행되기 전에 스크립트 소스 텍스트를 파싱하고 초기 에러 조건을 분석할 수 있다. 하지만 에러
보고는 이 명세가 해당 소스 텍스트에 대해 실제로 ParseScript를 수행하는 시점까지 지연되어야 한다.
16.1.6 ScriptEvaluation ( scriptRecord )
추상 연산 ScriptEvaluation은 scriptRecord (스크립트 레코드 )를 인자로 받아 정상 완료(normal completion)
(내부에 ECMAScript 언어 값 를 포함) 또는 비정상 완료(abrupt
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
globalEnv 를 scriptRecord .[[Realm]] .[[GlobalEnv]] 로 설정한다.
scriptContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
scriptContext 의 Function을 null 로 설정한다.
scriptContext 의 Realm 을 scriptRecord .[[Realm]] 으로 설정한다.
scriptContext 의 ScriptOrModule을 scriptRecord 로 설정한다.
scriptContext 의 VariableEnvironment를 globalEnv 로 설정한다.
scriptContext 의 LexicalEnvironment를 globalEnv 로 설정한다.
scriptContext 의 PrivateEnvironment를 null 로 설정한다.
실행 중인 실행 컨텍스트 를 일시 중지한다.
scriptContext 를 실행 컨텍스트 스택 에 푸시한다;
scriptContext 가 이제 실행 중인 실행 컨텍스트 가
된다.
script 를 scriptRecord .[[ECMAScriptCode]] 로
설정한다.
result 를 Completion (GlobalDeclarationInstantiation (script ,
globalEnv ))로 설정한다.
result 가 정상 완료(normal
completion) 이면,
result 를 Completion (Evaluation of script )로
설정한다.
result 가 정상
완료(normal completion) 이고 result .[[Value]] 가 empty 이면,
result 를 NormalCompletion (undefined )로
설정한다.
scriptContext 를 일시 중지하고 실행 컨텍스트 스택 에서 제거한다.
Assert :
실행 컨텍스트 스택 는 비어 있지 않다.
실행 컨텍스트 스택 의 최상단에 있는 컨텍스트를
실행 중인 실행 컨텍스트 로 복구한다.
? result 를 반환한다.
16.1.7 GlobalDeclarationInstantiation ( script ,
env )
추상 연산 GlobalDeclarationInstantiation은 script (Script 구문 노드 )와 env
(글로벌 환경 레코드 )를 인자로 받으며, 정상 완료(normal completion)
(unused 포함) 또는 throw
completion 를 반환한다.
script 는 execution context 가 설정되는 Script 이며,
env 는 바인딩이 생성될 글로벌 환경이다.
참고 1
스크립트 평가를 위해 execution context 가 설정될 때, 선언은 현재
글로벌 환경에 인스턴스화된다.
코드에 선언된 각 글로벌 바인딩이 인스턴스화된다.
호출 시 다음 단계를 수행한다:
lexNames 를 script 의 LexicallyDeclaredNames 로
설정한다.
varNames 를 script 의 VarDeclaredNames 로
설정한다.
lexNames 의 각 요소 name 에 대해,
HasLexicalDeclaration (env ,
name )가 true 이면 SyntaxError 예외를
throw한다.
hasRestrictedGlobal 를 ? HasRestrictedGlobalProperty (env ,
name )로 설정한다.
참고: 글로벌 var 및 function 바인딩(비엄격 직접
eval 에서 도입된 것을 제외)은 non-configurable이므로 restricted global
properties이다.
hasRestrictedGlobal 가 true 이면
SyntaxError 예외를 throw한다.
varNames 의 각 요소 name 에 대해,
HasLexicalDeclaration (env ,
name )가 true 이면 SyntaxError 예외를
throw한다.
varDeclarations 를 script 의 VarScopedDeclarations 로
설정한다.
functionsToInitialize 를 새로운 빈 List 로 설정한다.
declaredFunctionNames 를 새로운 빈 List 로 설정한다.
varDeclarations 의 각 요소 d 에 대해, 역순 List 순서로,
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 모두가 아니라면,
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이다.
참고: 동일 이름의 함수 선언이 여러 개면 마지막 선언이 사용된다.
fn 을 d 의 BoundNames 의
단일 요소로 설정한다.
declaredFunctionNames 가 fn 을 포함하지 않으면,
fnDefinable 을 ? CanDeclareGlobalFunction (env ,
fn )로 설정한다.
fnDefinable 이 false 이면
TypeError 예외를 throw한다.
fn 을 declaredFunctionNames 에 추가한다.
d 를 functionsToInitialize 의 첫 번째 요소로 삽입한다.
declaredVarNames 를 새로운 빈 List 로 설정한다.
varDeclarations 의 각 요소 d 에 대해,
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 하나라면,
d 의 BoundNames 의
각 문자열 vn 에 대해,
declaredFunctionNames 가 vn 을 포함하지 않으면,
vnDefinable 을 ? CanDeclareGlobalVar (env ,
vn )로 설정한다.
vnDefinable 이 false 이면
TypeError 예외를 throw한다.
declaredVarNames 가 vn 을 포함하지 않으면,
vn 을 declaredVarNames 에
추가한다.
참고: global object 가 ordinary
object 이면 이 알고리즘 단계 이후 비정상 종료가 발생하지 않는다. 하지만 global
object 가 Proxy exotic object 라면 이후 단계에서 비정상 종료를
유발할 수 있다.
참고: 부록 B.3.2.2 에서 이
지점에 추가 단계를 삽입한다.
lexDeclarations 를 script 의 LexicallyScopedDeclarations 로
설정한다.
privateEnv 를 null 로 설정한다.
lexDeclarations 의 각 요소 d 에 대해,
참고: 렉시컬 선언 이름은 여기서 인스턴스화만 되고 초기화는 되지 않는다.
d 의 BoundNames 의 각 요소
dn 에 대해,
IsConstantDeclaration (d )가
true 이면,
? env .CreateImmutableBinding (dn ,
true )를 수행한다.
그 외에는,
? env .CreateMutableBinding (dn ,
false )를 수행한다.
functionsToInitialize 의 각 구문 노드 f 에
대해,
fn 을 f 의 BoundNames 의 단일
요소로 설정한다.
fo 를 f 에 대해 InstantiateFunctionObject 를
env 와 privateEnv 인자로 호출한 결과로 설정한다.
? CreateGlobalFunctionBinding (env ,
fn , fo , false )를 수행한다.
declaredVarNames 의 각 문자열 vn 에 대해,
? CreateGlobalVarBinding (env ,
vn , false )를 수행한다.
unused 를 반환한다.
참고 2
초기 에러 는
16.1.1 에서 함수/var
선언과 let/const/class 선언 간의 이름 충돌 및 단일 Script 내에서의 let/const/class 바인딩 재선언을 방지한다. 그러나
여러 Script 에 걸친 충돌 및 재선언은
GlobalDeclarationInstantiation 실행 중 런타임 에러로 감지된다. 이러한 에러가 감지되면 스크립트에 대해 어떤 바인딩도 인스턴스화되지
않는다. 하지만 global object 가 Proxy
exotic object 로 정의된 경우, 런타임 충돌 선언 검사가 신뢰할 수 없어 비정상 완료(abrupt
completion) 와 일부 글로벌 선언이 인스턴스화되지 않을 수 있다.
이 경우 Script 의 코드는 평가되지 않는다.
명시적인 var 또는 function 선언과 달리, global object 에 직접 생성된 프로퍼티는
let/const/class 선언에 의해 그림자 처리될 수 있다.
16.2 모듈
구문
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield,
+Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
16.2.1 모듈 의미론
16.2.1.1 정적 의미: 초기 에러
ModuleBody : ModuleItemList
참고
중복 ExportedNames 규칙은
하나의 ModuleBody 내에 여러
export default ExportDeclaration 항목이 있으면 구문
에러임을 의미한다. 충돌 또는 중복 선언과 관련된 추가 에러 조건은 Module 의 평가 이전, 모듈 연결 단계에서 검사된다. 이러한 에러가
감지되면 Module 는 평가되지 않는다.
ModuleExportName
: StringLiteral
16.2.1.2 정적 의미: ImportedLocalNames(
importEntries
)
추상 연산 ImportedLocalNames는 importEntries (List of ImportEntry
Record )를 인자로 받고, 문자열 List 를 반환한다.
importEntries 로 정의된 모든 지역 이름 바인딩의 List 를 생성한다. 호출 시 다음
단계를 수행한다:
localNames 를 새로운 빈 List 로 설정한다.
importEntries 의 각 ImportEntry Record i 에
대해,
i .[[LocalName]] 을 localNames 에
추가한다.
localNames 를 반환한다.
16.2.1.3 ModuleRequest 레코드
ModuleRequest
Record 는 주어진 import 속성으로 모듈을 import하기 위한 요청을 나타낸다. 다음 필드로 구성된다:
표 40: ModuleRequest Record 필드
LoadedModuleRequest Record 는 모듈 import 요청과 결과 Module Record 를 함께 나타낸다. 표
40 에 정의된 필드에 [[Module]] 이 추가된다:
표 41: LoadedModuleRequest Record
필드
ImportAttribute Record 는 다음 필드로 구성된다:
표 42: ImportAttribute Record 필드
필드 이름
값 타입
의미
[[Key]]
문자열
속성 key
[[Value]]
문자열
속성 value
16.2.1.3.1 ModuleRequestsEqual ( left ,
right )
추상 연산 ModuleRequestsEqual은 left (ModuleRequest Record
또는 LoadedModuleRequest Record )
와 right (ModuleRequest Record 또는 LoadedModuleRequest Record )
를 인자로 받고, Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
left .[[Specifier]] 가 right .[[Specifier]] 와 다르면 false 를 반환한다.
leftAttrs 를 left .[[Attributes]] 로
설정한다.
rightAttrs 를 right .[[Attributes]] 로
설정한다.
leftAttrsCount 를 leftAttrs 의 요소 개수로 설정한다.
rightAttrsCount 를 rightAttrs 의 요소 개수로 설정한다.
leftAttrsCount ≠ rightAttrsCount 이면
false 를 반환한다.
leftAttrs 의 각 ImportAttribute
Record l 에 대해,
rightAttrs 에 l .[[Key]] 와
l .[[Value]] 가 동일한 ImportAttribute
Record r 가 없으면
false 를 반환한다.
true 를 반환한다.
16.2.1.4 정적 의미: ModuleRequests
구문-지향 연산
ModuleRequests는 인수를 받지 않으며 List of
ModuleRequest Record 를 반환한다. 다음 생성 규칙에 따라
개별적으로 정의된다:
Module : [empty]
새로운 빈 List 를 반환한다.
ModuleItemList :
ModuleItem
ModuleItem 의
ModuleRequests 를
반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
requests 를 ModuleItemList 의 ModuleRequests 로
설정한다.
additionalRequests 를 ModuleItem 의 ModuleRequests 로
설정한다.
additionalRequests 의 각 ModuleRequest
Record mr 에 대해,
requests 에 ModuleRequest
Record mr2 가 없고, ModuleRequestsEqual (mr ,
mr2 )가 true 가 아니면,
mr 를 requests 에 추가한다.
requests 를 반환한다.
ModuleItem : StatementListItem
새로운 빈 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
;
specifier 를 FromClause 의 SV 로 설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause
;
specifier 를 FromClause 의 SV 로 설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
;
specifier 를 ModuleSpecifier 의 SV 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause
;
specifier 를 ModuleSpecifier 의 SV 로
설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
;
specifier 를 FromClause 의 SV 로 설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » }인 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause
;
specifier 를 FromClause 의 SV 로 설정한다.
attributes 를 WithClause 의 WithClauseToAttributes 로
설정한다.
유일한 요소가 ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes }인 List 를 반환한다.
ExportDeclaration
:
export
NamedExports
;
export
VariableStatement
export
Declaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
새로운 빈 List 를 반환한다.
16.2.1.5 추상 모듈 레코드
Module Record 는 단일 모듈의 import와 export에 대한
구조적 정보를 캡슐화한다. 이 정보는 연결된 모듈 집합의 import와 export를 연결하는 데 사용된다. Module Record는 모듈을 평가할 때만 사용하는
네 개의 필드를 포함한다.
명세 목적상 Module Record 값은 Record
명세 타입의 값이며, Module Record가 추상 클래스이고 추상 및 구체 서브클래스를 가진 단순 객체지향 계층에 존재한다고 생각할 수 있다. 이 명세서는
Cyclic
Module Record 라는 추상 서브클래스와 Source Text Module
Record 라는 구체 서브클래스를 정의한다. 다른 명세와 구현체들은 자신들이 정의한 대안적 모듈 정의 기능에 대응하는
추가적인 Module Record 서브클래스를 정의할 수 있다.
Module Record는 표 43 에 나열된 필드를 정의한다. 모든 Module
Definition 서브클래스는 최소한 이 필드들을 포함한다. 또한 Module Record는 표 44 에 나열된 추상 메서드 목록을
정의한다. 모든 Module Definition 서브클래스는 이 추상 메서드들의 구체 구현을 제공해야 한다.
표 43: Module Record 필드
표 44: Module Record 의 추상 메서드
메서드
목적
LoadRequestedModules([hostDefined ])
모듈을 연결할 수 있도록 모든 의존성을 재귀적으로 로드하며, 프라미스를 반환한다.
GetExportedNames([exportStarSet ])
이 모듈에서 직접 또는 간접적으로 export되는 모든 이름의 리스트를 반환한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
ResolveExport(exportName [, resolveSet ])
이 모듈에서 export된 이름의 바인딩을 반환한다. 바인딩은 { [[Module]] : Module
Record , [[BindingName]] : String |
namespace } 형태의 ResolvedBinding Record 로 표현된다. 만약 export가 어떤
모듈에도 직접 바인딩되지 않은 Module Namespace Object라면 [[BindingName]] 은
namespace 로 설정된다. 이름을 해결할 수 없으면
null 을, 여러 바인딩이 발견되면
ambiguous 를 반환한다.
이 연산이 특정 exportName , resolveSet 쌍으로 호출될 때마다 같은
결과를 반환해야 한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
Link()
모듈의 평가를 준비하기 위해 모든 모듈 의존성을 추이적으로 해결하고 Module Environment
Record 를 생성한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
Evaluate()
이 모듈과 그 의존성의 평가에 대한 프라미스를 반환한다. 평가가 성공하거나 이미 성공적으로 평가된 경우 resolve되며,
평가 에러가 발생하거나 이미 실패한 경우 reject된다. 프라미스가 reject될 경우 호스트 는
프라미스 reject를 처리하고 평가 에러를 다시 throw해야 한다.
이 메서드를 호출하기 전에 Link가 성공적으로 완료되어야 한다.
16.2.1.5.1 EvaluateModuleSync ( module )
추상 연산 EvaluateModuleSync는 module (Module Record )를
인자로 받고, 정상 완료(normal
completion) (unused 포함) 또는 throw
completion 를 반환한다. 호출자는 module 의 평가가 이미 settle된 프라미스를
반환함을 보장해야 하며, module 을 동기적으로 평가한다. 호출 시 다음 단계를 수행한다:
Assert :
module 은 Cyclic Module Record 가 아니다.
promise 를 module .Evaluate()로 설정한다.
Assert :
promise .[[PromiseState]] 가
fulfilled 또는 rejected 이다.
promise .[[PromiseState]] 가
rejected 이면,
promise .[[PromiseIsHandled]] 이
false 이면, HostPromiseRejectionTracker (promise ,
"handle" )를 수행한다.
promise .[[PromiseIsHandled]] 을
true 로 설정한다.
ThrowCompletion (promise .[[PromiseResult]] )를 반환한다.
unused 를 반환한다.
16.2.1.6 순환 모듈 레코드
순환 모듈
레코드 는 Cyclic Module Record 타입의 다른 모듈들과의 의존성
사이클에 참여할 수 있는 모듈에 대한 정보를 나타내는 데 사용됩니다. Module Records 가
Cyclic
Module Record 타입의 하위 클래스가 아닌 경우 Source
Text Module Records 와의 의존성 사이클에 참여해서는 안 됩니다.
표 43 에 정의된 필드들 외에도 Cyclic
Module Records 는 표 45 에 나열된 추가 필드들을
가집니다.
표 45: 순환 모듈 레코드 의 추가 필드
필드 이름
값 타입
의미
[[Status]]
new , unlinked ,
linking , linked ,
evaluating ,
evaluating-async , 또는
evaluated
처음에는 new 입니다. 모듈의 생애 주기 동안
unlinked , linking ,
linked , evaluating , 경우에 따라
evaluating-async ,
evaluated 로(그 순서로) 전이됩니다.
evaluating-async 는 이 모듈이 비동기 의존성이 완료된 후 실행 대기 중이거나
[[HasTLA]] 필드가 true 인 모듈로서
실행되었고, 최상위 완료를 대기 중임을 나타냅니다.
[[EvaluationError]]
throw
completion 또는 empty
평가 중 발생한 예외를 나타내는 throw
completion 입니다. 예외가 발생하지 않았거나 [[Status]] 가 evaluated 가
아니면 undefined 입니다.
[[DFSAncestorIndex]]
integer 또는
empty
Link 및 Evaluate 중에만 사용하는 보조 필드입니다. [[Status]] 가
linking 또는 evaluating 일 때,
이 값은 모듈의 깊이 우선 탐색 인덱스이거나 동일한 강하게 연결된 구성 요소 내의 "이전" 모듈의 인덱스입니다.
[[RequestedModules]]
List
of ModuleRequest
Records
이 모듈의 import와 연관된 ModuleRequest
Records 의 List 입니다.
import의 소스 텍스트 발생 순서대로 리스트가 정렬됩니다.
[[LoadedModules]]
List
of LoadedModuleRequest
Records
이 레코드가 나타내는 모듈이 상대적 import 속성을 가지고 모듈을 import 요청할 때 사용한 specifier 문자열에서
Module
Record 로 매핑되는 정보입니다. 리스트에는 Records
r1 과 r2 가 존재하지 않습니다. ModuleRequestsEqual (r1 ,
r2 )가 true 인 경우.
[[CycleRoot]]
Cyclic Module Record
또는 empty
사이클 내에서 처음 방문한 모듈, 강하게 연결된 구성 요소의 루트 DFS 조상입니다. 사이클에 속하지 않은 모듈의 경우 자신이
됩니다. Evaluate가 완료된 후, 모듈의 [[DFSAncestorIndex]] 는
[[CycleRoot]] 의 깊이 우선 탐색 인덱스가 됩니다.
[[HasTLA]]
Boolean
이 모듈이 개별적으로 비동기적인지 여부(예: 최상위 await가 포함된 Source Text Module
Record 일 경우). 비동기 의존성이 있다고 해서 이 필드가
true 가 되는 것은 아닙니다. 이 필드는 모듈이 파싱된 이후에 변경되면 안 됩니다.
[[AsyncEvaluationOrder]]
unset , integer , 또는
done
이 필드는 처음에 unset 으로 설정되며, 완전히 동기적인 모듈의 경우 계속
unset 입니다. 모듈 자체가 비동기이거나 비동기 의존성을 가진 경우, integer 로 설정되어 16.2.1.6.1.3.4 에
의해 대기 중인 모듈 실행 순서를 결정합니다. 대기 모듈이 실행되면 done 으로
설정됩니다.
[[TopLevelCapability]]
PromiseCapability
Record 또는 empty
이 모듈이 어떤 사이클의 [[CycleRoot]] 이고, 그 사이클의 모듈 중 하나에
대해 Evaluate()가 호출된 경우, 이 필드는 전체 평가에 대한 PromiseCapability
Record 를 포함합니다. 이는 Evaluate() 추상 메서드에서 반환되는
Promise 객체를 해결하는 데 사용됩니다. 해당 모듈의 의존성에는 empty 가 되며,
일부 의존성에 대해 최상위 Evaluate()가 시작된 경우를 제외합니다.
[[AsyncParentModules]]
List
of Cyclic Module
Records
이 모듈 또는 의존성이 [[HasTLA]]
true 이고, 실행이 진행 중이라면, 이 필드는 최상위 실행 작업에 대한 이 모듈의 부모
importers를 추적합니다. 이 부모 모듈들은 이 모듈이 성공적으로 실행 완료되기 전까지는 실행을 시작하지 않습니다.
[[PendingAsyncDependencies]]
integer 또는
empty
이 모듈에 비동기 의존성이 있으면, 이 필드는 해당 모듈이 실행될 때까지 남은 비동기 의존성 모듈의 수를 추적합니다. 비동기
의존성이 있는 모듈은 이 값이 0이 되고 실행 오류가 없을 때 실행됩니다.
표 44 에 정의된 메서드들 외에도
순환 모듈
레코드 는 표 46 에 나열된 추가 메서드들을 가집니다.
표 46: 순환 모듈 레코드 의 추가 추상 메서드
GraphLoadingState 레코드 는 모듈 그래프의 로딩 과정에 대한 정보를 담고 있는 Record 입니다. 이는
HostLoadImportedModule 호출 이후 로딩을
계속하기 위해 사용됩니다. 각 GraphLoadingState 레코드 는 표 47 에 정의된 필드들을 가집니다:
표 47: GraphLoadingState 레코드 의 필드
16.2.1.6.1 모듈 레코드 추상 메서드의 구현
아래는 순환 모듈 레코드 에 대한 구체적인 메서드로, 모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.6.1.1 LoadRequestedModules (
[hostDefined ] )
순환 모듈 레코드 module 의
LoadRequestedModules 구체적인 메서드는 선택적 인자 hostDefined (임의 값)을 받고 Promise를
반환합니다. 이 메서드는 module 의 의존성 그래프에 있는 모든 모듈 레코드 의 [[LoadedModules]] 를 채웁니다(대부분의 작업은 보조 함수 InnerModuleLoading 에서 수행됩니다).
선택적 hostDefined 파라미터는 HostLoadImportedModule 훅에
전달됩니다. 호출 시 다음과 같은 절차를 수행합니다:
hostDefined 가 없으면 hostDefined 를
empty 로 설정한다.
pc 를 ! NewPromiseCapability (%Promise% )로 설정한다.
state 를 GraphLoadingState
Record { [[IsLoading]] :
true , [[PendingModulesCount]] :
1, [[Visited]] : « », [[PromiseCapability]] : pc , [[HostDefined]] : hostDefined }로
설정한다.
InnerModuleLoading (state ,
module )을 수행한다.
pc .[[Promise]] 를 반환한다.
참고
hostDefined 인자는 import된 모듈을 가져오는데 필요한 추가 정보를 전달하는 데 사용할 수 있습니다. 예를 들어
HTML에서는 <link rel="preload" as="..."> 태그에 대해 올바른 fetch
destination을 설정하는 데 사용합니다.
import() 표현식에서는 hostDefined 인자를 절대 설정하지 않습니다.
16.2.1.6.1.1.1 InnerModuleLoading (
state , module )
추상 연산 InnerModuleLoading은 state (GraphLoadingState
Record )와 module (모듈 레코드 )를 인자로 받고,
unused 를 반환합니다. LoadRequestedModules에서 module 의
의존성 그래프에 대해 실제 로딩 과정을 재귀적으로 수행할 때 사용됩니다. 호출 시 다음과 같은 절차를 수행합니다:
Assert : state .[[IsLoading]] 이 true 임을 확인한다.
module 이 순환 모듈
레코드 이고, module .[[Status]] 가 new 이며,
state .[[Visited]] 에
module 이 포함되어 있지 않으면, 다음을 수행한다:
module 을 state .[[Visited]] 에 추가한다.
requestedModulesCount 를 module .[[RequestedModules]] 의 요소 수로 설정한다.
state .[[PendingModulesCount]] 를
state .[[PendingModulesCount]] +
requestedModulesCount 로 설정한다.
module .[[RequestedModules]] 의
각 ModuleRequest
Record request 에 대해 다음을 수행한다:
AllImportAttributesSupported (request .[[Attributes]] )가
false 이면:
error 를 ThrowCompletion (새로
생성된 SyntaxError 객체)로 설정한다.
ContinueModuleLoading (state ,
error )를 수행한다.
그렇지 않고 module .[[LoadedModules]] 에 LoadedModuleRequest
Record record 가 존재하며,
ModuleRequestsEqual (record ,
request )가 true 이면:
InnerModuleLoading (state ,
record .[[Module]] )을 수행한다.
그 밖의 경우,
HostLoadImportedModule (module ,
request , state .[[HostDefined]] ,
state )를 수행한다.
참고: HostLoadImportedModule 는
FinishLoadingImportedModule 를
호출하며, 이는 ContinueModuleLoading 를
통해 그래프 로딩 프로세스에 재진입합니다.
state .[[IsLoading]] 이
false 이면
unused 를 반환한다.
Assert : state .[[PendingModulesCount]] ≥ 1임을 확인한다.
state .[[PendingModulesCount]] 를
state .[[PendingModulesCount]] - 1로
설정한다.
state .[[PendingModulesCount]] = 0이면
다음을 수행한다:
state .[[IsLoading]] 를
false 로 설정한다.
state .[[Visited]] 의 각
순환 모듈 레코드
loaded 에 대해 다음을 수행한다:
loaded .[[Status]] 가
new 이면 loaded .[[Status]] 를
unlinked 로 설정한다.
! Call (state .[[PromiseCapability]] .[[Resolve]] ,
undefined ,
«undefined »)를 수행한다.
unused 를 반환한다.
16.2.1.6.1.1.2 ContinueModuleLoading (
state , moduleCompletion )
추상 연산 ContinueModuleLoading은 state (GraphLoadingState
Record )와 moduleCompletion (정상 완료(normal
completion) 로 모듈 레코드 를 포함하거나,
throw
completion 중 하나) 두 인자를 받아 unused 를
반환합니다. 이 연산은 HostLoadImportedModule
호출 이후 로딩 과정을 다시 진입할 때 사용됩니다. 호출 시 다음의 절차를 수행합니다:
state .[[IsLoading]] 이
false 이면 unused 를 반환한다.
moduleCompletion 이 정상 완료(normal
completion) 인 경우:
InnerModuleLoading (state ,
moduleCompletion .[[Value]] )를
수행한다.
그 밖의 경우:
state .[[IsLoading]] 를
false 로 설정한다.
! Call (state .[[PromiseCapability]] .[[Reject]] ,
undefined , « moduleCompletion .[[Value]] »)를 수행한다.
unused 를 반환한다.
16.2.1.6.1.2 Link ( )
순환 모듈 레코드 module 의
Link 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 성공 시 Link는 이 모듈의 [[Status]] 를 unlinked 에서
linked 로 전이시킵니다. 실패 시 예외가 throw되고 이 모듈의 [[Status]] 는 unlinked 상태로 남습니다. (대부분의
작업은 보조 함수 InnerModuleLinking 에서 수행됩니다.)
호출 시 다음의 절차를 수행합니다:
Assert : module .[[Status]] 는 unlinked ,
linked , evaluating-async , 또는
evaluated 중 하나이다.
stack 을 새로운 빈 List 로
설정한다.
result 를 Completion (InnerModuleLinking (module ,
stack , 0))로 설정한다.
result 가 비정상 완료(abrupt
completion) 인 경우:
stack 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
Assert :
m .[[Status]] 는
linking 이다.
m .[[Status]] 를
unlinked 로 설정한다.
Assert : module .[[Status]] 는
unlinked 이다.
? result 를 반환한다.
Assert : module .[[Status]] 는 linked ,
evaluating-async , 또는 evaluated
중 하나이다.
Assert : stack 이 비어 있다.
unused 를 반환한다.
16.2.1.6.1.2.1 InnerModuleLinking (
module , stack , index )
추상 연산 InnerModuleLinking은 module (모듈 레코드 ),
stack (List of
순환 모듈 레코드 ),
index (음이 아닌 integer ) 인자를 받아, 정상 완료(normal
completion) 로 음이 아닌 integer 를 포함하거나 throw
completion 를 반환합니다. Link에서 module 의 실제 linking
과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack , index
인자와 모듈의 [[DFSAncestorIndex]] 필드는 깊이 우선 탐색(DFS) 과정을 추적하는
데 사용됩니다. 특히 [[DFSAncestorIndex]] 는 강하게 연결된 구성 요소(SCC)를
찾기 위한 용도로 활용되어, SCC 내의 모든 모듈이 함께 linked 로 전이됩니다. 호출 시 다음의
절차를 수행합니다:
module 이 순환 모듈
레코드 가 아니면:
? module .Link()를 수행한다.
index 를 반환한다.
module .[[Status]] 가
linking , linked ,
evaluating-async , 또는
evaluated 중 하나이면:
index 를 반환한다.
Assert : module .[[Status]] 는 unlinked 이다.
module .[[Status]] 를
linking 로 설정한다.
moduleIndex 를 index 로 설정한다.
module .[[DFSAncestorIndex]] 를
index 로 설정한다.
index 를 index + 1로 설정한다.
module 을 stack 에 추가한다.
module .[[RequestedModules]] 의 각
ModuleRequest Record
request 에 대해 다음을 수행한다:
requiredModule 을 GetImportedModule (module ,
request )로 설정한다.
index 를 ? InnerModuleLinking (requiredModule ,
stack , index )로 설정한다.
requiredModule 이 순환 모듈 레코드 이면:
Assert :
requiredModule .[[Status]] 는
linking ,
linked ,
evaluating-async , 또는
evaluated 중 하나이다.
Assert :
requiredModule .[[Status]] 가
linking 인 경우에만 stack 에
requiredModule 이 포함되어 있다.
requiredModule .[[Status]] 가
linking 이면:
module .[[DFSAncestorIndex]] 를
min (module .[[DFSAncestorIndex]] ,
requiredModule .[[DFSAncestorIndex]] )로
설정한다.
? module .InitializeEnvironment()를 수행한다.
Assert : module 이
stack 에 정확히 한 번만 존재한다.
Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 이다.
module .[[DFSAncestorIndex]] =
moduleIndex 이면:
done 을 false 로 설정한다.
done 이 false 인 동안 반복한다:
requiredModule 을 stack 의 마지막 요소로
설정한다.
stack 의 마지막 요소를 제거한다.
Assert :
requiredModule 은 순환 모듈
레코드 이다.
requiredModule .[[Status]] 를
linked 로 설정한다.
requiredModule 과 module 이 동일한
모듈
레코드 이면 done 을
true 로 설정한다.
index 를 반환한다.
16.2.1.6.1.3 Evaluate ( )
순환 모듈 레코드 module 의
Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. Evaluate는 이 모듈의 [[Status]] 를 linked 에서
evaluating-async 또는 evaluated 로 전이시킵니다.
해당 강하게 연결된 구성 요소 내의 모듈에 대해 처음 호출될 때, Evaluate는 모듈 평가가 완료될 때 resolve되는 Promise를 생성하여
반환합니다. 이 Promise는 해당 구성 요소의 [[CycleRoot]] 의 [[TopLevelCapability]] 필드에 저장됩니다. 이후 해당 구성 요소 내의 어떤 모듈에 대해
Evaluate를 호출해도 동일한 Promise를 반환합니다. (대부분의 작업은 보조 함수 InnerModuleEvaluation 에서
수행됩니다.) 호출 시 다음 절차를 수행합니다:
Assert : 이 Evaluate 호출은 주변
에이전트 내에서 다른 Evaluate 호출과 동시에 발생하지 않는다.
Assert : module .[[Status]] 는 linked ,
evaluating-async 또는 evaluated
중 하나이다.
module .[[Status]] 가
evaluating-async 또는
evaluated 라면, module 을
module .[[CycleRoot]] 로 설정한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
module .[[TopLevelCapability]] .[[Promise]] 를 반환한다.
stack 을 새로운 빈 List 로
설정한다.
capability 를 ! NewPromiseCapability (%Promise% )로 설정한다.
module .[[TopLevelCapability]] 를
capability 로 설정한다.
result 를 Completion (InnerModuleEvaluation (module ,
stack , 0))로 설정한다.
result 가 비정상 완료(abrupt
completion) 인 경우:
stack 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
Assert :
m .[[Status]] 는
evaluating 이다.
Assert :
m .[[AsyncEvaluationOrder]] 는
unset 이다.
m .[[Status]] 를
evaluated 로 설정한다.
m .[[EvaluationError]] 를
result 로 설정한다.
Assert : module .[[Status]] 는
evaluated 이다.
Assert : module .[[EvaluationError]] 와 result 는 동일한
Completion
Record 이다.
! Call (capability .[[Reject]] , undefined , «
result .[[Value]] »)를 수행한다.
그 밖의 경우:
Assert : module .[[Status]] 는
evaluating-async 또는
evaluated 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[Status]] 가
evaluated 라면:
참고: 이는 module 의 평가가 동기적으로 완료됨을 의미한다.
Assert :
module .[[AsyncEvaluationOrder]] 는
unset 이다.
! Call (capability .[[Resolve]] ,
undefined , «
undefined »)를 수행한다.
Assert : stack 이 비어
있다.
capability .[[Promise]] 를 반환한다.
16.2.1.6.1.3.1 InnerModuleEvaluation (
module , stack , index )
추상 연산 InnerModuleEvaluation은 module (모듈 레코드 ),
stack (List of
순환 모듈 레코드 ),
index (음이 아닌 integer ) 인자를 받아, 정상 완료(normal
completion) 로 음이 아닌 integer 를 포함하거나 throw
completion 를 반환합니다. Evaluate에서 module 의 실제 평가
과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack , index
인자와 module 의 [[DFSAncestorIndex]] 필드는
InnerModuleLinking 에서와 동일하게
사용됩니다. 호출 시 다음 절차를 수행합니다:
module 이 순환 모듈
레코드 가 아니면:
? EvaluateModuleSync (module )를
수행한다.
index 를 반환한다.
module .[[Status]] 가
evaluating-async 또는
evaluated 라면:
module .[[EvaluationError]] 가
empty 이면 index 를 반환한다.
그 밖의 경우, ? module .[[EvaluationError]] 를 반환한다.
module .[[Status]] 가
evaluating 이면 index 를 반환한다.
Assert : module .[[Status]] 는 linked 이다.
module .[[Status]] 를
evaluating 로 설정한다.
moduleIndex 를 index 로 설정한다.
module .[[DFSAncestorIndex]] 를
index 로 설정한다.
module .[[PendingAsyncDependencies]] 를
0으로 설정한다.
index 를 index + 1로 설정한다.
module 을 stack 에 추가한다.
module .[[RequestedModules]] 의 각
ModuleRequest Record
request 에 대해 다음을 수행한다:
requiredModule 을 GetImportedModule (module ,
request )로 설정한다.
index 를 ? InnerModuleEvaluation (requiredModule ,
stack , index )로 설정한다.
requiredModule 이 순환 모듈 레코드 이면:
Assert :
requiredModule .[[Status]] 는
evaluating ,
evaluating-async 또는
evaluated 중 하나이다.
Assert :
requiredModule .[[Status]] 가
evaluating 일 때만 stack 에
requiredModule 이 포함되어 있다.
requiredModule .[[Status]] 가
evaluating 이면:
module .[[DFSAncestorIndex]] 를
min (module .[[DFSAncestorIndex]] ,
requiredModule .[[DFSAncestorIndex]] )로
설정한다.
그 밖의 경우:
requiredModule 을
requiredModule .[[CycleRoot]] 로 설정한다.
Assert :
requiredModule .[[Status]] 는
evaluating-async 또는
evaluated 이다.
requiredModule .[[EvaluationError]] 가
empty 가 아니면
? requiredModule .[[EvaluationError]] 를
반환한다.
requiredModule .[[AsyncEvaluationOrder]] 가
integer 라면:
module .[[PendingAsyncDependencies]] 를
module .[[PendingAsyncDependencies]]
+ 1로 설정한다.
module 을
requiredModule .[[AsyncParentModules]] 에
추가한다.
module .[[PendingAsyncDependencies]]
> 0이거나 module .[[HasTLA]] 가
true 이면:
Assert :
module .[[AsyncEvaluationOrder]] 는
unset 이다.
module .[[AsyncEvaluationOrder]] 를 IncrementModuleAsyncEvaluationCount ()로
설정한다.
module .[[PendingAsyncDependencies]] = 0이면
ExecuteAsyncModule (module )를
수행한다.
그 밖의 경우:
? module .ExecuteModule() 을
수행한다.
Assert : module 이
stack 에 정확히 한 번만 존재한다.
Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 이다.
module .[[DFSAncestorIndex]] =
moduleIndex 이면:
done 을 false 로 설정한다.
done 이 false 인 동안 반복한다:
requiredModule 을 stack 의 마지막 요소로
설정한다.
stack 의 마지막 요소를 제거한다.
Assert :
requiredModule 은 순환 모듈
레코드 이다.
Assert :
requiredModule .[[AsyncEvaluationOrder]] 는
integer 또는
unset 이다.
requiredModule .[[AsyncEvaluationOrder]] 가
unset 이면
requiredModule .[[Status]] 를
evaluated 로 설정한다.
그 밖의 경우 requiredModule .[[Status]] 를
evaluating-async 로 설정한다.
requiredModule 과 module 이 동일한
모듈
레코드 이면 done 을
true 로 설정한다.
requiredModule .[[CycleRoot]] 를
module 로 설정한다.
index 를 반환한다.
Note 1
모듈은 InnerModuleEvaluation에 의해 순회되는 동안 evaluating
상태이며, 실행이 끝나면 evaluated 상태가 되고, [[HasTLA]] 필드가 true 이거나 비동기
의존성이 있을 경우 실행 중 evaluating-async 상태가 됩니다.
Note 2
비동기 사이클의 모듈에 의존하는 모든 모듈은 해당 사이클이 evaluating 상태가 아닐
때, [[CycleRoot]] 를 통해 사이클의 루트 실행에 의존하게 됩니다. 이를
통해 사이클의 상태를 루트 모듈 상태를 통해 하나의 강하게 연결된 구성 요소로 취급할 수 있습니다.
16.2.1.6.1.3.2 ExecuteAsyncModule (
module )
추상 연산 ExecuteAsyncModule은 module (순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 는 evaluating 또는
evaluating-async 중 하나이다.
Assert : module .[[HasTLA]] 가 true 이다.
capability 를 ! NewPromiseCapability (%Promise% )로 설정한다.
fulfilledClosure 를 module 을 캡처하고 호출 시 다음을 수행하는, 파라미터
없는 새로운 추상 클로저(Abstract
Closure) 로 설정한다:
AsyncModuleExecutionFulfilled (module )을
수행한다.
NormalCompletion (undefined )를
반환한다.
onFulfilled 를 CreateBuiltinFunction (fulfilledClosure ,
0, "" , « »)로 설정한다.
rejectedClosure 를 module 을 캡처하고 호출 시 다음을 수행하는,
파라미터(error )를 갖는 새로운 추상 클로저(Abstract
Closure) 로 설정한다:
AsyncModuleExecutionRejected (module ,
error )를 수행한다.
NormalCompletion (undefined )를
반환한다.
onRejected 를 CreateBuiltinFunction (rejectedClosure ,
0, "" , « »)로 설정한다.
PerformPromiseThen (capability .[[Promise]] , onFulfilled ,
onRejected )를 수행한다.
! module .ExecuteModule (capability )을
수행한다.
unused 를 반환한다.
16.2.1.6.1.3.3 GatherAvailableAncestors (
module , execList )
추상 연산 GatherAvailableAncestors는 module (순환 모듈 레코드 ),
execList (List of
순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[AsyncParentModules]] 의 각
순환 모듈 레코드
m 에 대해 다음을 수행한다:
execList 에 m 이 없고 m .[[CycleRoot]] .[[EvaluationError]] 가
empty 라면:
Assert :
m .[[Status]] 는
evaluating-async 이다.
Assert :
m .[[EvaluationError]] 는
empty 이다.
Assert :
m .[[AsyncEvaluationOrder]] 는
integer 이다.
Assert :
m .[[PendingAsyncDependencies]]
> 0이다.
m .[[PendingAsyncDependencies]] 를
m .[[PendingAsyncDependencies]] -
1로 설정한다.
m .[[PendingAsyncDependencies]] =
0이면:
m 을 execList 에 추가한다.
m .[[HasTLA]] 가
false 이면 GatherAvailableAncestors (m ,
execList )를 수행한다.
unused 를 반환한다.
Note
루트 module 의 비동기 실행이 fulfilled(이행)될 때, 이 함수는 해당 완료와 함께 동기적으로 실행
가능한 모듈들의 리스트를 결정하여 execList 에 채웁니다.
16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled (
module )
추상 연산 AsyncModuleExecutionFulfilled는 module (순환 모듈 레코드 ) 인자를 받아
unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[Status]] 가
evaluated 라면:
Assert :
module .[[EvaluationError]] 는
empty 가 아니다.
unused 를 반환한다.
Assert : module .[[Status]] 는
evaluating-async 이다.
Assert : module .[[AsyncEvaluationOrder]] 는 integer 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
module .[[Status]] 를
evaluated 로 설정한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
module .[[CycleRoot]] 와
module 은 동일한 모듈
레코드 이다.
! Call (module .[[TopLevelCapability]] .[[Resolve]] ,
undefined , «
undefined »)를 수행한다.
execList 를 새로운 빈 List 로
설정한다.
GatherAvailableAncestors (module ,
execList )를 수행한다.
Assert : execList 의 모든
요소는 [[AsyncEvaluationOrder]] 필드가 integer 로, [[PendingAsyncDependencies]] 필드가 0으로, [[EvaluationError]] 필드가
empty 로 설정되어 있다.
sortedExecList 를 execList 의 요소들을 [[AsyncEvaluationOrder]] 필드 오름차순으로 정렬한 List 로
설정한다.
sortedExecList 의 각 순환 모듈
레코드 m 에 대해 다음을 수행한다:
m .[[Status]] 가
evaluated 라면:
Assert :
m .[[EvaluationError]] 는
empty 가 아니다.
그 밖의 경우 m .[[HasTLA]] 가
true 이면:
ExecuteAsyncModule (m )를
수행한다.
그 밖의 경우:
result 를 m .ExecuteModule() 로
설정한다.
result 가 비정상
완료(abrupt completion) 라면:
AsyncModuleExecutionRejected (m ,
result .[[Value]] )를 수행한다.
그 밖의 경우:
m .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
m .[[Status]] 를
evaluated 로 설정한다.
m .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
m .[[CycleRoot]] 와
m 은 동일한 모듈
레코드 이다.
! Call (m .[[TopLevelCapability]] .[[Resolve]] ,
undefined , «
undefined »)를
수행한다.
unused 를 반환한다.
16.2.1.6.1.3.5 AsyncModuleExecutionRejected (
module , error )
추상 연산 AsyncModuleExecutionRejected는 module (순환 모듈 레코드 ),
error (ECMAScript 언어
값 ) 인자를 받아 unused 를 반환합니다. 호출 시 다음
절차를 수행합니다:
module .[[Status]] 가
evaluated 라면:
Assert :
module .[[EvaluationError]] 는
empty 가 아니다.
unused 를 반환한다.
Assert : module .[[Status]] 는
evaluating-async 이다.
Assert : module .[[AsyncEvaluationOrder]] 는 integer 이다.
Assert : module .[[EvaluationError]] 는
empty 이다.
module .[[EvaluationError]] 를
ThrowCompletion (error )로
설정한다.
module .[[Status]] 를
evaluated 로 설정한다.
module .[[AsyncEvaluationOrder]] 를
done 로 설정한다.
참고: module .[[AsyncEvaluationOrder]] 는
AsyncModuleExecutionFulfilled 와의
대칭성을 위해 done 로 설정됩니다. InnerModuleEvaluation 에서는
모듈의 [[EvaluationError]] 내부 슬롯이
empty 가 아니면 [[AsyncEvaluationOrder]] 내부 슬롯 값은 사용되지 않습니다.
module .[[AsyncParentModules]] 의 각
순환 모듈 레코드
m 에 대해 다음을 수행한다:
AsyncModuleExecutionRejected (m ,
error )를 수행한다.
module .[[TopLevelCapability]] 가
empty 가 아니면:
Assert :
module .[[CycleRoot]] 와
module 은 동일한 모듈
레코드 이다.
! Call (module .[[TopLevelCapability]] .[[Reject]] ,
undefined , « error »)를 수행한다.
unused 를 반환한다.
16.2.1.6.2 순환 모듈 레코드 그래프 예시
이 비규범 섹션에서는 몇 가지 일반적인 모듈 그래프의 연결(linking) 및 평가(evaluation) 예시를 시리즈로 보여주며, 특히 오류가 어떻게 발생할
수 있는지에 중점을 둡니다.
먼저 다음과 같은 간단한 모듈 그래프를 생각해 보겠습니다:
그림 2: 간단한 모듈 그래프
먼저 오류 조건이 없다고 가정해 봅시다. host 가 처음 A .LoadRequestedModules()를 호출하면,
이 호출은 가정에 따라 성공적으로 완료되며, B 와 C 의 의존성도 재귀적으로 로드됩니다(각각 C 와
없음). 그리고 A .[[Status]] = B .[[Status]] = C .[[Status]] =
unlinked 로 설정됩니다. 이후 host 가 A .Link()를 호출하면, (다시 가정에 따라) 성공적으로
완료되어 A .[[Status]] = B .[[Status]] = C .[[Status]] =
linked 가 됩니다. 이러한 준비 단계는 언제든 수행될 수 있습니다. 이후 host 가 모듈의 모든 부작용을 감수할 준비가 되었을 때
A .Evaluate()를 호출할 수 있고, 이 호출은 성공적으로 완료되며(다시 가정에 따라)
undefined 로 resolve되는 Promise를 반환하고, 먼저 C 그리고 B 를
재귀적으로 평가합니다. 이 시점에서 각 모듈의 [[Status]] 는
evaluated 가 됩니다.
그 다음 성공적으로 A .LoadRequestedModules()를 호출한 뒤 연결(linking) 오류가 발생하는 경우를 생각해 봅시다.
만일 InnerModuleLinking 이 C 에서
성공하지만, 이후 B 에서 실패한다면(예를 들어 B 가 C 가 제공하지 않는 것을 import하는
경우), 원래의 A .Link()는 실패하고, A 와 B 의 [[Status]] 는 unlinked 인 상태로 남습니다.
C 의 [[Status]] 는 linked 가 됩니다.
마지막으로, Link()를 성공적으로 호출한 뒤 평가 오류가 발생하는 경우를 생각해 보겠습니다. 만일 InnerModuleEvaluation 이
C 에서 성공하지만, 이후 B 에서 실패한다면(예를 들어 B 가 예외를 던지는 코드를 포함하는 경우),
원래의 A .Evaluate()는 실패하여 rejected Promise를 반환하게 됩니다. 결과적인 예외는 A 와
B 의 [[EvaluationError]] 필드에 저장되고, 두 모듈의 [[Status]] 는 evaluated 가 됩니다. C 도
evaluated 가 되지만, A 와 B 와 달리 [[EvaluationError]] 없이 성공적으로 평가를 완료합니다. 예외를 저장하는 것은 호스트 가 A 나
B 를 Evaluate()로 재사용하려 할 때 항상 동일한 예외를 만나도록 보장합니다. (호스트 는 순환 모듈
레코드 를 반드시 재사용할 필요는 없으며, 호스트 가 해당 메서드에서 던져진 예외 객체를 반드시 노출할 필요도 없습니다. 하지만 명세상
이러한 동작이 가능하도록 되어 있습니다.)
이제 다른 종류의 오류 조건을 생각해 봅시다:
그림 3: 해결 불가능한 모듈이 있는 모듈 그래프
이 시나리오에서 A 모듈은 다른 모듈에 대한 의존성을 선언하지만, 해당 모듈에 대한 모듈 레코드 가 존재하지 않습니다. 즉,
HostLoadImportedModule 가 요청 시
FinishLoadingImportedModule 를
예외와 함께 호출합니다. 이는 해당 리소스가 존재하지 않거나, 리소스는 존재하지만 ParseModule 가 소스 텍스트 파싱 시
오류를 반환하는 등 다양한 이유로 발생할 수 있습니다. 호스트 는 FinishLoadingImportedModule 에
전달한 완료(completion)를 통해 실패 원인을 노출할 수도 있습니다. 어쨌든 이 예외는 로딩 실패를 초래하며, A 의 [[Status]] 는 new 상태로 남습니다.
여기서 로딩, 연결, 평가 오류의 차이는 다음과 같은 특성 때문입니다:
평가(Evaluation) 는 부작용이 있을 수 있으므로 반드시 한
번만 수행되어야 하며, 평가가 이미 수행됐는지(성공하지 않았더라도) 기억하는 것이 중요합니다. (오류의 경우에도 예외를 기억하는 것이 합리적인데,
그렇지 않으면 이후 Evaluate() 호출마다 새 예외를 생성해야 합니다.)
반면 연결(linking)은 부작용이 없으므로 실패하더라도 나중에 재시도해도 문제가 없습니다.
로딩은 호스트 와 밀접하게
상호작용하며, 호스트에 따라 실패한 로딩을 재시도할 수 있도록 하는 것이 바람직할 수 있습니다.(예: 네트워크 장애 등 일시적 문제일 경우)
이제 사이클이 있는 모듈 그래프를 생각해 봅시다:
그림 4: 순환 모듈 그래프
여기서는 진입점이 A 모듈이라고 가정합니다. 호스트 가 A .LoadRequestedModules()를 호출하면
InnerModuleLoading 이 A 에
대해 실행됩니다. 이것은 다시 B 와 C 에 대해 InnerModuleLoading 을
호출합니다. 사이클 때문에 다시 InnerModuleLoading 이 A 에
대해 트리거되지만, 이 시점에서는 A 의 의존성 로딩이 이미 시작됐으므로 아무 작업도 하지 않습니다(no-op). 그래프의 모든 모듈이
성공적으로 로드되면 이들의 [[Status]] 가 동시에 new 에서
unlinked 로 전이됩니다.
그 다음 호스트 가
A .Link()를 호출하면 InnerModuleLinking 이 A 에
대해 실행됩니다. 이것은 다시 B 에 대해 InnerModuleLinking 을 호출합니다. 사이클 때문에
다시 InnerModuleLinking 이 A 에
대해 트리거되지만, 이 시점에서는 A .[[Status]] 가 이미
linking 이므로 아무 작업도 하지 않습니다(no-op). B .[[Status]] 자체는 linking 상태로 남아 있다가 제어가 다시 A 로
돌아오면 C 에 대해 InnerModuleLinking 이 트리거됩니다.
C .[[Status]] 가 linked 가 되고 나면
A 와 B 가 함께 linking 에서
linked 로 전이됩니다. 이는 두 모듈이 강하게 연결된 구성 요소이기 때문입니다. 모듈 그래프가 깊이우선탐색으로
순회되는 이 단계에서는 SCC 내의 모듈들을 동시에 상태 전이시킬 수 있습니다.
성공 케이스에서는 순환 모듈 그래프의 평가(evaluation) 단계도 위와 유사하게 동작합니다.
이제 A 에 연결 오류가 있는 경우를 생각해 보겠습니다. 예를 들어 A 가 C 에 존재하지 않는 바인딩을
import하려고 하는 경우입니다. 이 경우 위의 단계는 여전히 발생하며, InnerModuleLinking 의
두 번째 호출에서 조기 반환(early return)이 있습니다. 그러나 원래의 InnerModuleLinking 에
다시 되돌아오면, InitializeEnvironment(특히 C .ResolveExport() 직후)에서 실패하게 됩니다. 던져진
SyntaxError 예외는 A .Link까지 전파되고, 이때 현재 스택에 있는 모든 모듈(항상 아직
linking 상태인 모듈들)을 reset합니다. 따라서 A 와 B 는
unlinked 가 됩니다. C 는 linked 상태로
남습니다.
또는 A 에 평가 오류가 있는 경우(예: 소스 코드가 예외를 던지는 경우)를 생각해 봅니다. 이 경우 평가 단계에서도 위와 유사한 과정이
발생하며, InnerModuleEvaluation 의 두 번째
호출에서 조기 반환이 있습니다. 원래의 InnerModuleEvaluation 에 되돌아오면,
가정에 따라 실패하게 됩니다. 던져진 예외는 A .Evaluate()까지 전파되고, 이때 현재 스택에 있는 모든 모듈(아직
evaluating 상태인 모듈들)과 [[AsyncParentModules]] 를 통해, 의존성 그래프 전체에서 최상위 await를
포함하거나 의존하는 모듈 체인에도 오류가 기록됩니다(AsyncModuleExecutionRejected
알고리즘을 통해). 따라서 A 와 B 는 evaluated 가 되고, 예외가
A 와 B 의 [[EvaluationError]] 필드에 기록되며,
C 는 evaluated 이지만 [[EvaluationError]] 는 없습니다.
마지막으로, 모든 모듈이 비동기적으로 완료되는 사이클이 있는 모듈 그래프를 생각해 봅시다:
그림 5: 비동기 순환 모듈 그래프
로딩 및 연결은 이전과 같이 진행되며, 모든 모듈의 [[Status]] 는
linked 가 됩니다.
A .Evaluate()를 호출하면 InnerModuleEvaluation 이
A , B , D 에 대해 호출되어 모두 evaluating
상태로 전이됩니다. 그 후 InnerModuleEvaluation 이
A 에 대해 한 번 더 호출되지만 이미 evaluating 상태이므로 아무 작업도 하지
않습니다(no-op). 이 시점에서 D .[[PendingAsyncDependencies]] 가
0이므로 ExecuteAsyncModule (D )가
호출되고, D .ExecuteModule이 새로운 PromiseCapability와 함께 호출되어 D 의 비동기 실행을
추적합니다. 다시 InnerModuleEvaluation 로 돌아가서
B 에 대해 B .[[PendingAsyncDependencies]] 를 1로,
B .[[AsyncEvaluationOrder]] 를 1로 설정합니다. 다시 InnerModuleEvaluation 의 원래 호출로
돌아가서 A 의 [[PendingAsyncDependencies]] 를 1로 설정합니다. 다음
반복에서 A 의 의존성 루프가 끝나면 InnerModuleEvaluation 이
C 에 대해, 그리고 D (다시 no-op), E 에 대해 호출됩니다. E 는 의존성이
없고 사이클에도 포함되지 않으므로 ExecuteAsyncModule (E )가
D 와 동일하게 호출되고 E 는 바로 스택에서 제거됩니다. 다시 한 번 InnerModuleEvaluation 의
C 호출로 돌아와 C .[[AsyncEvaluationOrder]] 를 3으로
설정합니다. 이제 A 의 의존성 루프가 끝나면 A .[[AsyncEvaluationOrder]] 를 4로 설정하고, 전체 SCC를 스택에서 제거하여 모든 모듈이 동시에
evaluating-async 로 전이됩니다. 이 시점에서 모듈들의 필드는 표 48 에 나옵니다.
표 48: 초기 Evaluate() 호출 후 모듈 필드
필드
모듈
A
B
C
D
E
[[DFSAncestorIndex]]
0
0
0
0
4
[[Status]]
evaluating-async
evaluating-async
evaluating-async
evaluating-async
evaluating-async
[[AsyncEvaluationOrder]]
4
1
3
0
2
[[AsyncParentModules]]
« »
« A »
« A »
« B , C »
« C »
[[PendingAsyncDependencies]]
2 (B 및 C )
1 (D )
2 (D 및 E )
0
0
E 가 먼저 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled 가
호출되고 E .[[Status]] 가 evaluated 로
설정되며 C .[[PendingAsyncDependencies]] 가 1로 감소합니다. 업데이트된
모듈들의 필드는 표 49 에 나옵니다.
표 49: 모듈 E 실행 완료 후 모듈 필드
필드
모듈
C
E
[[DFSAncestorIndex]]
0
4
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
3
done
[[AsyncParentModules]]
« A »
« C »
[[PendingAsyncDependencies]]
1 (D )
0
D 가 다음으로 실행을 완료합니다(아직 실행 중인 유일한 모듈이었음). 이때 AsyncModuleExecutionFulfilled 가
다시 호출되고 D .[[Status]] 가
evaluated 로 설정됩니다. 실행 가능한 상위 모듈은 B ([[AsyncEvaluationOrder]] 가 1)와 C ([[AsyncEvaluationOrder]] 가 3)로, B 가 먼저 처리됩니다:
B .[[PendingAsyncDependencies]] 가 0으로 감소하고 ExecuteAsyncModule 가
B 에 호출되어 실행을 시작합니다. C .[[PendingAsyncDependencies]] 역시 0으로 감소하고 C 도 실행을
시작합니다(만약 B 에 await가 있으면 C 와 병렬로 실행될 수 있음). 업데이트된 모듈들의
필드는 표 50 에 나옵니다.
표 50: 모듈 D 실행 완료 후 모듈 필드
필드
모듈
B
C
D
[[DFSAncestorIndex]]
0
0
0
[[Status]]
evaluating-async
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
1
3
done
[[AsyncParentModules]]
« A »
« A »
« B , C »
[[PendingAsyncDependencies]]
0
0
0
C 가 다음으로 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되어 C .[[Status]] 가
evaluated 로 설정되고 A .[[PendingAsyncDependencies]] 가 1로 감소합니다. 업데이트된 모듈들의 필드는 표 51 에 나옵니다.
표 51: 모듈 C 실행 완료 후 모듈 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
그 다음 B 가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되고 B .[[Status]] 가
evaluated 로 설정됩니다. A .[[PendingAsyncDependencies]] 가 0으로 감소하므로 ExecuteAsyncModule 가 호출되어 실행을
시작합니다. 업데이트된 모듈들의 필드는 표
52 에 나옵니다.
표 52: 모듈 B 실행 완료 후 모듈 필드
필드
모듈
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
마지막으로 A 가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled 가
다시 호출되어 A .[[Status]] 가
evaluated 로 설정됩니다. 이 시점에서 A .[[TopLevelCapability]] 의 Promise(A .Evaluate()에서 반환된
Promise)가 resolve되어 이 모듈 그래프의 처리가 종료됩니다. 업데이트된 모듈의 필드는 표 53 에 나옵니다.
표 53: 모듈 A 실행 완료 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
한편 C 가 실행에 실패하고 B 가 완료되기 전에 오류를 반환하는 실패 케이스를 생각해 봅시다. 이때 AsyncModuleExecutionRejected 가
호출되어 C .[[Status]] 가
evaluated 로, C .[[EvaluationError]] 가 오류로 설정됩니다. 그런 다음 이 오류는 모든
AsyncParentModules에 전파되어 각각에 대해 AsyncModuleExecutionRejected 가
호출됩니다. 업데이트된 모듈들의 필드는 표
54 에 나옵니다.
표 54: 모듈 C 오류 발생 후 모듈 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
[[EvaluationError]]
empty
C 의 평가 오류
A 는 C 와 동일한 오류로 rejected됩니다. 이는 C 가 A 에 대해
AsyncModuleExecutionRejected 를
C 의 오류로 호출하기 때문입니다. A .[[Status]] 는
evaluated 로 설정됩니다. 이 시점에서 A .[[TopLevelCapability]] 의 Promise(A .Evaluate()에서 반환된
Promise)는 reject됩니다. 업데이트된 모듈의 필드는 표 55 에 나옵니다.
표 55: 모듈 A 가 reject된 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
[[EvaluationError]]
C 의 평가 오류
그 후 B 는 오류 없이 실행을 마칩니다. 이 경우 AsyncModuleExecutionFulfilled 가
다시 호출되고 B .[[Status]] 가
evaluated 로 설정됩니다. GatherAvailableAncestors 가
B 에 대해 호출됩니다. 그러나 A .[[CycleRoot]] 는 평가 오류가
있는 A 이므로 반환된 sortedExecList 에 추가되지 않으며 AsyncModuleExecutionFulfilled 는
추가 처리를 하지 않고 반환됩니다. 이후 B 를 import하는 모듈은 C 에서 사이클 루트 A 에
설정된 평가 오류를 B .[[CycleRoot]] .[[EvaluationError]] 의 rejection으로 처리하게 됩니다. 업데이트된 모듈의 필드는
표 56 에 나와 있습니다.
표 56: 오류가 있는 그래프에서 B 가 실행 완료된 후의 모듈 필드
필드
모듈
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
4
1
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
[[EvaluationError]]
C 의 Evaluation 오류
empty
16.2.1.7 소스 텍스트 모듈 레코드
소스 텍스트
모듈 레코드 는 ECMAScript 소스 텍스트 (11 )로 정의된 모듈에 대한 정보를 나타내는
데 사용되며, goal symbol Module 을 사용하여 파싱됩니다. 그 필드에는 모듈이
import 및 export하는 이름에 대한 정제된 정보가 담겨 있으며, 구체적 메서드는 이 정보들을 사용하여 모듈을 linking 및 평가합니다.
소스
텍스트 모듈 레코드 는 추상 모듈 레코드 타입의 다른 하위
클래스들과 함께 모듈 그래프 내에 존재할 수 있고, 순환 모듈 레코드 타입의 다른 하위 클래스들과 사이클에 참여할 수
있습니다.
표 45 에 정의된 필드 외에도, 소스 텍스트
모듈 레코드 는 표 57 에
나열된 추가 필드를 가집니다. 이러한 필드는 모두 ParseModule 에서 최초로 설정됩니다.
표 57: 소스 텍스트 모듈 레코드 의 추가 필드
ImportEntry
레코드 는 단일 선언적 import에 대한 정보를 정제한 레코드 입니다. 각 ImportEntry
레코드 는 표 58 에 정의된 필드를
가집니다:
표 58: ImportEntry 레코드 의 필드
참고 1
표
59 는 구문 import 형태를 표현하는 데 사용되는 ImportEntry 레코드 필드 예시를 제공합니다:
표 59(참고): ImportEntry 레코드 형태로 Import
구문 매핑
import문 형식
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace-object
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
ImportEntry
레코드 가 생성되지 않습니다.
ExportEntry
레코드 는 단일 선언적 export에 대한 정보를 정제한 레코드 입니다. 각 ExportEntry
레코드 는 표 60 에 정의된 필드를 가집니다:
표 60: ExportEntry 레코드 의 필드
참고 2
표
61 는 구문 export 형태를 표현하는 데 사용되는 ExportEntry 레코드 필드 예시를 제공합니다:
표 61(참고): ExportEntry 레코드 형태로 Export
구문 매핑
export문 형식
[[ExportName]]
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
export var v;
"v"
null
null
"v"
export default function f() {}
"default"
null
null
"f"
export default function () {}
"default"
null
null
"*default*"
export default 42;
"default"
null
null
"*default*"
export {x};
"x"
null
null
"x"
export {v as x};
"x"
null
null
"v"
export {x} from "mod";
"x"
"mod"
"x"
null
export {v as x} from "mod";
"x"
"mod"
"v"
null
export * from "mod";
null
"mod"
all-but-default
null
export * as ns from "mod";
"ns"
"mod"
all
null
다음 정의들은 소스 텍스트 모듈 레코드 에 필요한 구체적 메서드 및 기타
추상 연산 을 명시합니다.
16.2.1.7.1 ParseModule ( sourceText ,
realm , hostDefined )
추상 연산 ParseModule은 sourceText (ECMAScript 소스 텍스트 ),
realm (Realm Record ), 그리고
hostDefined (임의의 값)을 인자로 받으며, 소스 텍스트 모듈 레코드 또는 비어
있지 않은 List 의
SyntaxError 객체를 반환합니다. 이 연산은 sourceText 를 Module 로 파싱한 결과를 기반으로 소스
텍스트 모듈 레코드 를 생성합니다. 호출 시 다음 단계를 수행합니다:
body 를 ParseText (sourceText ,
Module )로 설정한다.
body 가 오류의 List 인 경우,
body 를 반환한다.
requestedModules 를 ModuleRequests
of body 로 설정한다.
importEntries 를 ImportEntries
of body 로 설정한다.
importedBoundNames 를 ImportedLocalNames (importEntries )로
설정한다.
indirectExportEntries 를 새로운 빈 List 로
설정한다.
localExportEntries 를 새로운 빈 List 로
설정한다.
starExportEntries 를 새로운 빈 List 로
설정한다.
exportEntries 를 ExportEntries
of body 로 설정한다.
exportEntries 의 각 ExportEntry
Record ee 에 대해 다음을 수행한다:
ee .[[ModuleRequest]] 가
null 이면:
importedBoundNames 에 ee .[[LocalName]] 이 포함되어 있지 않으면:
ee 를 localExportEntries 에 추가한다.
그 밖의 경우:
ie 를 importEntries 중 [[LocalName]] 이
ee .[[LocalName]] 인
요소로 설정한다.
ie .[[ImportName]] 이
namespace-object 이면:
참고: 이것은 import된 모듈 네임스페이스 객체의 재export이다.
ee 를 localExportEntries 에
추가한다.
그 밖의 경우:
참고: 이것은 단일 이름의 재export이다.
ExportEntry
Record { [[ModuleRequest]] :
ie .[[ModuleRequest]] , [[ImportName]] :
ie .[[ImportName]] , [[LocalName]] :
null , [[ExportName]] :
ee .[[ExportName]] }를
indirectExportEntries 에 추가한다.
그 밖의 경우 ee .[[ImportName]] 이
all-but-default 이면:
Assert : ee .[[ExportName]] 이
null 임을 확인한다.
ee 를 starExportEntries 에 추가한다.
그 밖의 경우:
ee 를 indirectExportEntries 에 추가한다.
async 를 body Contains
await로 설정한다.
Source Text Module Record
{ [[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[CycleRoot]] : empty , [[HasTLA]] : async , [[AsyncEvaluationOrder]] : unset ,
[[TopLevelCapability]] : empty ,
[[AsyncParentModules]] : « », [[PendingAsyncDependencies]] :
empty , [[Status]] :
new , [[EvaluationError]] :
empty , [[HostDefined]] :
hostDefined , [[ECMAScriptCode]] :
body , [[Context]] :
empty , [[ImportMeta]] :
empty , [[RequestedModules]] :
requestedModules , [[LoadedModules]] : « »,
[[ImportEntries]] : importEntries , [[LocalExportEntries]] : localExportEntries ,
[[IndirectExportEntries]] :
indirectExportEntries , [[StarExportEntries]] : starExportEntries ,
[[DFSAncestorIndex]] : empty }를
반환한다.
참고
구현체는 모듈 소스 텍스트를 미리 파싱하고 Early Error 조건을 분석할 수 있지만, 어떤 오류의 보고도 실제로 이 명세가 해당 소스
텍스트에 대해 ParseModule을 수행하는 시점까지는 지연되어야 합니다.
16.2.1.7.2 모듈 레코드 추상 메서드의 구현
아래는 소스 텍스트 모듈 레코드 에 대한 구체적 메서드로,
모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.7.2.1 GetExportedNames (
[exportStarSet ] )
소스 텍스트 모듈 레코드
module 의 GetExportedNames 구체적 메서드는 선택적 인자
exportStarSet (List of
소스 텍스트 모듈 레코드 )를 받고, 문자열
List 를 반환합니다.
호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 가 new 가 아님을 확인한다.
exportStarSet 가 없으면 exportStarSet 를 새로운 빈 List 로
설정한다.
exportStarSet 에 module 이 포함되어 있으면:
Assert : export *
순환의 시작점에 도달함을 확인한다.
새로운 빈 List 를
반환한다.
module 을 exportStarSet 에 추가한다.
exportedNames 를 새로운 빈 List 로
설정한다.
module .[[LocalExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : module 이 이
export에 대해 직접 바인딩을 제공함을 확인한다.
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
e .[[ExportName]] 을
exportedNames 에 추가한다.
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : module 이 이
export에 대해 특정 바인딩을 import함을 확인한다.
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
e .[[ExportName]] 을
exportedNames 에 추가한다.
module .[[StarExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ModuleRequest]] 가 null 이
아님을 확인한다.
requestedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로 설정한다.
starNames 를
requestedModule .GetExportedNames(exportStarSet )로
설정한다.
starNames 의 각 n 에 대해:
n 이 "default" 가 아니면:
exportedNames 에 n 이 없으면
n 을 exportedNames 에 추가한다.
exportedNames 를 반환한다.
참고
GetExportedNames는 별표(export *) export 바인딩의 모호한 이름을 필터링하거나 예외를 발생시키지 않습니다.
16.2.1.7.2.2 ResolveExport ( exportName [ ,
resolveSet ] )
소스 텍스트 모듈 레코드
module 의 ResolveExport 구체적 메서드는 exportName (문자열)과 선택적 인자
resolveSet (필드 [[Module]] (모듈 레코드 )와 [[ExportName]] (문자열)을 가진 List of
Record ))를 받아
ResolvedBinding Record ,
null , 또는 ambiguous 를 반환합니다.
ResolveExport는 import된 바인딩을 실제 정의 모듈과 로컬 바인딩 이름으로 해결하려 시도합니다. 정의 모듈은 이 메서드가 호출된
모듈 레코드 일 수도 있고, 그 모듈이
import하는 다른 모듈일 수도 있습니다. resolveSet 파라미터는 미해결 순환 import/export 경로를 감지하기
위해 사용합니다. 특정 모듈 레코드 와
exportName 쌍이 resolveSet 에 이미 있으면 import 순환이 발견된 것입니다.
ResolveExport를 재귀적으로 호출하기 전에 module 과 exportName 쌍을
resolveSet 에 추가합니다.
정의 모듈이 발견되면 ResolvedBinding Record { [[Module]] , [[BindingName]] }를
반환합니다. 이 레코드는 요청된 export의 해결된 바인딩을 나타내지만, 네임스페이스로 export되고 로컬 바인딩이 없는 경우에는 [[BindingName]] 이 namespace 로 설정됩니다.
정의가 없거나 요청이 순환임이 발견되면 null 을 반환합니다. 요청이 모호함이 발견되면
ambiguous 를 반환합니다.
호출 시 다음 절차를 수행합니다:
Assert : module .[[Status]] 가 new 가 아님을 확인한다.
resolveSet 가 없으면 resolveSet 를 새로운 빈 List 로
설정한다.
resolveSet 의 각 Record
{ [[Module]] , [[ExportName]] } r 에 대해:
module 과 r .[[Module]] 이
동일한 모듈 레코드 이고
exportName 이 r .[[ExportName]] 이면:
Assert : 순환 import 요청임을
확인한다.
null 을 반환한다.
Record
{ [[Module]] : module , [[ExportName]] : exportName }를
resolveSet 에 추가한다.
module .[[LocalExportEntries]] 의 각
ExportEntry Record
e 에 대해:
e .[[ExportName]] 이
exportName 이면:
Assert :
module 이 이 export에 대해 직접 바인딩을 제공함을 확인한다.
ResolvedBinding
Record { [[Module]] : module , [[BindingName]] : e .[[LocalName]] }를 반환한다.
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
e .[[ExportName]] 이
exportName 이면:
Assert :
e .[[ModuleRequest]] 가
null 이 아님을 확인한다.
importedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로
설정한다.
e .[[ImportName]] 이
all 이면:
Assert :
module 이 이 export에 대해 직접 바인딩을 제공하지 않음을
확인한다.
ResolvedBinding
Record { [[Module]] :
importedModule , [[BindingName]] :
namespace }를 반환한다.
그 밖의 경우:
Assert :
module 이 이 export에 대해 특정 바인딩을 import함을
확인한다.
Assert :
e .[[ImportName]]
문자열 임을
확인한다.
importedModule .ResolveExport(e .[[ImportName]] ,
resolveSet )을 반환한다.
exportName 이 "default" 이면:
Assert : 이 모듈에서
default export가 명시적으로 정의되지 않았음을 확인한다.
null 을 반환한다.
참고: default export는 export * from "mod"
선언으로 제공될 수 없다.
starResolution 을 null 로 설정한다.
module .[[StarExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ModuleRequest]] 가 null 이
아님을 확인한다.
importedModule 을 GetImportedModule (module ,
e .[[ModuleRequest]] )로 설정한다.
resolution 을
importedModule .ResolveExport(exportName ,
resolveSet )로 설정한다.
resolution 이 ambiguous 이면
ambiguous 를 반환한다.
resolution 이 null 이 아니면:
Assert :
resolution 이 ResolvedBinding
Record 임을 확인한다.
starResolution 이 null 이면
starResolution 을 resolution 으로 설정한다.
그 밖의 경우:
Assert : 요청된
이름을 포함하는 * import가 둘 이상임을 확인한다.
resolution .[[Module]] 과
starResolution .[[Module]] 이 동일한 모듈
레코드 가 아니면
ambiguous 를 반환한다.
resolution .[[BindingName]] 이
starResolution .[[BindingName]] 과 다르고,
resolution .[[BindingName]] 또는
starResolution .[[BindingName]] 이
namespace 인 경우
ambiguous 를 반환한다.
resolution .[[BindingName]] 문자열 이고,
starResolution .[[BindingName]] 문자열 이며,
두 값이 다르면 ambiguous 를 반환한다.
starResolution 을 반환한다.
16.2.1.7.3 순환 모듈 레코드 추상 메서드의 구현
아래는 소스 텍스트 모듈 레코드 에 대한 구체적 메서드로,
순환
모듈 레코드 추상 메서드(표 46 에 정의됨)를
구현합니다.
16.2.1.7.3.1 InitializeEnvironment ( )
소스 텍스트 모듈 레코드
module 의 InitializeEnvironment 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[IndirectExportEntries]] 의 각
ExportEntry Record
e 에 대해:
Assert : e .[[ExportName]] 가 null 이 아님을
확인한다.
resolution 을
module .ResolveExport(e .[[ExportName]] )로 설정한다.
resolution 이 null 또는
ambiguous 이면 SyntaxError
예외를 throw한다.
Assert : resolution 이
ResolvedBinding
Record 임을 확인한다.
Assert : module 의 모든 이름 있는
export가 해결 가능함을 확인한다.
realm 을 module .[[Realm]] 로
설정한다.
Assert : realm 이
undefined 가 아님을 확인한다.
env 를 NewModuleEnvironment (realm .[[GlobalEnv]] )로 설정한다.
module .[[Environment]] 를 env 로
설정한다.
module .[[ImportEntries]] 의 각 ImportEntry Record
in 에 대해:
importedModule 을 GetImportedModule (module ,
in .[[ModuleRequest]] )로 설정한다.
in .[[ImportName]] 이
namespace-object 이면:
namespace 를 GetModuleNamespace (importedModule )로
설정한다.
! env .CreateImmutableBinding(in .[[LocalName]] ,
true )를 수행한다.
! env .InitializeBinding(in .[[LocalName]] ,
namespace )를 수행한다.
그 밖의 경우:
resolution 을
importedModule .ResolveExport(in .[[ImportName]] )로 설정한다.
resolution 이 null 또는
ambiguous 이면
SyntaxError 예외를 throw한다.
resolution .[[BindingName]] 이
namespace 이면:
namespace 를 GetModuleNamespace (resolution .[[Module]] )로 설정한다.
! env .CreateImmutableBinding(in .[[LocalName]] ,
true )를 수행한다.
! env .InitializeBinding(in .[[LocalName]] ,
namespace )를 수행한다.
그 밖의 경우:
CreateImportBinding (env ,
in .[[LocalName]] ,
resolution .[[Module]] ,
resolution .[[BindingName]] )를 수행한다.
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
Assert : module .[[Realm]] 이 undefined 가 아님을 확인한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 PrivateEnvironment를 null 로 설정한다.
module .[[Context]] 를
moduleContext 로 설정한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제 실행 중인 실행 컨텍스트 이다.
code 를 module .[[ECMAScriptCode]] 로 설정한다.
varDeclarations 를 VarScopedDeclarations
of code 로 설정한다.
declaredVarNames 를 새로운 빈 List 로
설정한다.
varDeclarations 의 각 d 에 대해:
BoundNames
of d 의 각 dn 에 대해:
declaredVarNames 에 dn 이 없으면:
! env .CreateMutableBinding(dn ,
false )를 수행한다.
! env .InitializeBinding(dn ,
undefined )를 수행한다.
declaredVarNames 에 dn 을 추가한다.
lexDeclarations 를 LexicallyScopedDeclarations
of code 로 설정한다.
privateEnv 를 null 로 설정한다.
lexDeclarations 의 각 d 에 대해:
BoundNames
of d 의 각 dn 에 대해:
IsConstantDeclaration
of d 가 true 이면:
! env .CreateImmutableBinding(dn ,
true )를 수행한다.
그 밖의 경우:
! env .CreateMutableBinding(dn ,
false )를 수행한다.
d 가 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나이면:
fo 를 InstantiateFunctionObject
of d with arguments env ,
privateEnv 로 설정한다.
! env .InitializeBinding(dn ,
fo )를 수행한다.
moduleContext 를 실행 컨텍스트
스택 에서 제거한다.
unused 를 반환한다.
16.2.1.7.3.2 ExecuteModule ( [ capability ] )
소스 텍스트 모듈 레코드
module 의 ExecuteModule 구체적 메서드는 선택적 인자 capability (PromiseCapability
Record )를 받고, 정상 완료(normal
completion) 로 unused 를 포함하거나 throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
Assert : module 이 링크되고 모듈 환경
내 선언이 인스턴스화되었음을 확인한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
실행 중인 실행 컨텍스트 를 일시
중지한다.
module .[[HasTLA]] 가
false 이면:
Assert : capability 가
없음을 확인한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제
실행 중인 실행
컨텍스트 이다.
result 를 Completion (Evaluation of
module .[[ECMAScriptCode]] )로
설정한다.
moduleContext 를 일시 중지시키고, 실행 컨텍스트 스택 에서
제거한다.
실행 컨텍스트 스택 의 맨
위에 있는 컨텍스트를 실행 중인 실행
컨텍스트 로 재개한다.
result 가 비정상
완료(abrupt completion) 이면:
? result 를 반환한다.
그 밖의 경우:
Assert : capability 가
PromiseCapability
Record 임을 확인한다.
AsyncBlockStart (capability ,
module .[[ECMAScriptCode]] ,
moduleContext )를 수행한다.
unused 를 반환한다.
16.2.1.8 합성 모듈 레코드
합성 모듈 레코드 는 명세에 의해 정의된 모듈에 대한 정보를
나타내는 데 사용됩니다. export된 이름들은 생성 시에 정적으로 정의되며, 해당 값들은 SetSyntheticModuleExport 를 사용하여
시간이 지나면서 변경될 수 있습니다. import나 의존성이 없습니다.
참고
합성 모듈 레코드는 JSON 모듈이나 CSS 모듈 등 다양한 타입의 모듈을 정의하는 데 사용할 수 있습니다.
표 43 에 정의된 필드 외에도, 합성 모듈 레코드는
표 62 에 나열된 추가 필드를 가집니다.
표 62: 합성 모듈 레코드 의 추가 필드
16.2.1.8.1 CreateDefaultExportSyntheticModule (
defaultExport )
추상 연산 CreateDefaultExportSyntheticModule은 defaultExport (ECMAScript 언어 값 )을 인자로 받아
합성 모듈 레코드 를 반환합니다. 이 연산은
defaultExport 를 default export로 갖는 합성 모듈 레코드 를 생성합니다. 호출 시 다음
절차를 수행합니다:
realm 을 현재 Realm Record 로 설정한다.
setDefaultExport 를 파라미터(module )를 가지며
defaultExport 를 캡처하는 새로운 추상 클로저(Abstract
Closure) 로 설정하여, 호출 시 다음을 수행한다:
SetSyntheticModuleExport (module ,
"default" , defaultExport )를 수행한다.
NormalCompletion (unused )을
반환한다.
다음과 같은 합성 모듈 레코드 를 반환한다: {
[[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[HostDefined]] : undefined , [[ExportNames]] : « "default" », [[EvaluationSteps]] : setDefaultExport }.
16.2.1.8.2 ParseJSONModule ( source )
추상 연산 ParseJSONModule은 source (문자열)를 인자로 받아 정상 완료(normal
completion) 로 합성 모듈 레코드 를
포함하거나, throw
completion 를 반환합니다. 호출 시 다음 절차를 수행합니다:
json 을 ? ParseJSON (source )로 설정한다.
CreateDefaultExportSyntheticModule (json )을
반환한다.
16.2.1.8.3 SetSyntheticModuleExport ( module ,
exportName , exportValue )
추상 연산 SetSyntheticModuleExport는 module (합성 모듈 레코드 ),
exportName (문자열), exportValue (ECMAScript 언어 값 )을 인자로 받아
unused 를 반환합니다. 이 연산은 합성 모듈 레코드 의 기존 export에 대한 값을
설정하거나 변경할 수 있습니다. 호출 시 다음 절차를 수행합니다:
Assert :
module .[[ExportNames]] 에
exportName 이 포함되어 있음을 확인한다.
envRec 을 module .[[Environment]] 로
설정한다.
Assert :
envRec 가 empty 가 아님을 확인한다.
envRec .SetMutableBinding(exportName ,
exportValue , true )를 수행한다.
unused 를 반환한다.
16.2.1.8.4 모듈 레코드 추상 메서드의 구현
아래는 합성 모듈 레코드 에 대한 구체적 메서드로,
모듈 레코드 추상 메서드(표 44 에 정의됨)를
구현합니다.
16.2.1.8.4.1 LoadRequestedModules ( )
합성 모듈 레코드
module 의 LoadRequestedModules 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음
절차를 수행합니다:
! PromiseResolve (%Promise% ,
undefined )를 반환한다.
참고
16.2.1.8.4.2 GetExportedNames ( )
합성 모듈 레코드
module 의 GetExportedNames 구체적 메서드는 인자를 받지 않으며, 문자열 List 를 반환합니다.
호출 시 다음 절차를 수행합니다:
module .[[ExportNames]] 를 반환한다.
16.2.1.8.4.3 ResolveExport ( exportName )
합성 모듈 레코드
module 의 ResolveExport 구체적 메서드는 exportName (문자열)을 인자로 받아
ResolvedBinding Record 또는
null 을 반환합니다. 호출 시 다음 절차를 수행합니다:
module .[[ExportNames]] 에
exportName 이 없으면 null 을 반환한다.
ResolvedBinding Record
{ [[Module]] : module , [[BindingName]] : exportName }를 반환한다.
16.2.1.8.4.4 Link ( )
합성 모듈 레코드
module 의 Link 구체적 메서드는 인자를 받지 않으며 정상 완료(normal
completion) 로 unused 를 반환합니다. 호출 시 다음
절차를 수행합니다:
realm 을 module .[[Realm]] 로
설정한다.
env 을 NewModuleEnvironment (realm .[[GlobalEnv]] )로 설정한다.
module .[[Environment]] 를 env 로
설정한다.
module .[[ExportNames]] 의 각 문자열
exportName 에 대해:
! env .CreateMutableBinding(exportName ,
false )를 수행한다.
! env .InitializeBinding(exportName ,
undefined )를 수행한다.
NormalCompletion (unused )을
반환한다.
16.2.1.8.4.5 Evaluate ( )
합성 모듈 레코드
module 의 Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음 절차를 수행합니다:
moduleContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 설정한다.
moduleContext 의 Function을 null 로 설정한다.
moduleContext 의 Realm 을 module .[[Realm]] 로 설정한다.
moduleContext 의 ScriptOrModule을 module 로 설정한다.
moduleContext 의 VariableEnvironment를 module .[[Environment]] 로 설정한다.
moduleContext 의 LexicalEnvironment를 module .[[Environment]] 로 설정한다.
실행 중인 실행 컨텍스트 를 일시
중지한다.
moduleContext 를 실행 컨텍스트
스택 에 push한다; moduleContext 가 이제 실행 중인 실행 컨텍스트 이다.
steps 를 module .[[EvaluationSteps]] 로 설정한다.
result 를 Completion (steps (module ))로
설정한다.
moduleContext 를 일시 중지시키고, 실행 컨텍스트 스택 에서 제거한다.
실행 컨텍스트 스택 의 맨 위에 있는
컨텍스트를 실행 중인 실행 컨텍스트 로
재개한다.
pc 를 ! NewPromiseCapability (%Promise% )로 설정한다.
IfAbruptRejectPromise (result ,
pc )를 수행한다.
! Call (pc .[[Resolve]] , undefined , «
undefined »)를 수행한다.
pc .[[Promise]] 를 반환한다.
16.2.1.9 GetImportedModule ( referrer ,
request )
추상 연산 GetImportedModule은 referrer (순환 모듈 레코드 )와
request (ModuleRequest Record )를 인자로 받고 모듈 레코드 를 반환합니다. 호출 시 다음 절차를 수행합니다:
records 를 referrer .[[LoadedModules]] 에 있는 각 LoadedModuleRequest Record
r 중 ModuleRequestsEqual (r ,
request )가 true 인 것만 모은 List 로 설정한다.
Assert :
records 는 정확히 하나의 요소만을 가져야 하며, 이는 LoadRequestedModules가
referrer 에서 성공적으로 완료된 후 이 추상 연산이 호출되기 때문이다.
record 를 records 의 유일한 요소로 설정한다.
record .[[Module]] 를 반환한다.
16.2.1.10 HostLoadImportedModule ( referrer ,
moduleRequest , hostDefined , payload )
호스트 정의
추상 연산 HostLoadImportedModule은 referrer (스크립트 레코드 , 순환 모듈
레코드 , 또는 Realm Record ),
moduleRequest (ModuleRequest Record ),
hostDefined (임의 값), payload (GraphLoadingState
Record 또는 PromiseCapability
Record )를 인자로 받아 unused 를 반환합니다.
참고 1
referrer 가 Realm Record 가 될 수 있는 예시는 웹 브라우저
호스트 에서 발생합니다.
사용자가 아래와 같은 컨트롤을 클릭할 때
<button type="button" onclick="import('./foo.mjs')">Click me</button>
해당 시점에는 활성 스크립트나 모듈 이 존재하지 않습니다. 좀 더
일반적으로, 호스트 가
실행 컨텍스트 를
null ScriptOrModule 구성요소로 실행 컨텍스트 스택 에 push하는 모든 상황에서
발생할 수 있습니다.
HostLoadImportedModule의 구현체는 아래 요구사항을 따라야 합니다:
호스트
환경 은 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 수행해야 하며,
result 는 로드된 모듈 레코드 를 포함하는 정상 완료(normal
completion) 또는 throw completion
중 하나이어야 하며, 동기 또는 비동기적으로 처리될 수 있습니다.
이 연산이 두 쌍(referrer , moduleRequest )에 대해 여러 번 호출되고:
첫 번째 referrer 가 두 번째 referrer 와 동일할 것
ModuleRequestsEqual (첫 번째
moduleRequest , 두 번째 moduleRequest )가
true 일 것
그리고 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 result 가
정상 완료(normal
completion) 일 때 수행하면, 이후 반복 호출에서도 항상 동일한 result 로
호출해야 합니다.
moduleRequest .[[Attributes]] 에 entry 가
존재하고 entry .[[Key]] 가 "type" 이고
entry .[[Value]] 가 "json" 인 경우,
호스트
환경 이 FinishLoadingImportedModule (referrer ,
moduleRequest , payload , result )를 수행할 때,
result 는 ParseJSONModule 의 호출 결과로 반환된
Completion
Record 이거나 throw
completion 이어야 합니다.
연산은 payload 를 FinishLoadingImportedModule 에
전달해야 하는 불투명 값으로 취급해야 합니다.
실제 처리 과정은 호스트
정의 이지만, 일반적으로 적절한 모듈 레코드 를 로드하기 위한 필요한
모든 I/O 작업을 수행합니다. 여러 (referrer , moduleRequest .[[Specifier]] , moduleRequest .[[Attributes]] ) 삼중쌍이 동일한 모듈 레코드 인스턴스에 매핑될 수 있습니다. 실제 매핑
방식은 호스트
정의 이지만, 일반적으로 매핑 과정에서 specifier 에 대한 정규화 프로세스가 적용됩니다. 일반적인
정규화 과정에는 상대 경로 및 축약 경로 지정자의 확장이 포함될 수 있습니다.
참고 2
위 요구사항은 호스트 가
type: "json"으로 import할 때 JSON 모듈을 지원해야 함을 의미하지만(그리고
HostLoadImportedModule이 정상적으로 완료될 경우), type: "json" 없이 import할 때 JSON
모듈을 지원하는 것을 금지하지는 않습니다.
16.2.1.11 FinishLoadingImportedModule ( referrer ,
moduleRequest , payload , result )
FinishLoadingImportedModule 추상 연산은 referrer (스크립트 레코드 , 순환 모듈
레코드 , 또는 Realm Record ),
moduleRequest (ModuleRequest Record ),
payload (GraphLoadingState Record 또는
PromiseCapability Record ),
result (정상 완료(normal
completion) 로 모듈 레코드 를 포함하거나
throw completion )를
인자로 받아 unused 를 반환합니다. 호출 시 다음 절차를 수행합니다:
result 가 정상 완료(normal
completion) 이면:
referrer .[[LoadedModules]] 에 LoadedModuleRequest
Record record 가 존재하고 ModuleRequestsEqual (record ,
moduleRequest )가 true 이면:
Assert : record .[[Module]] 과 result .[[Value]] 는 동일한 모듈 레코드 임을
확인한다.
그 밖의 경우:
LoadedModuleRequest
Record { [[Specifier]] : moduleRequest .[[Specifier]] , [[Attributes]] :
moduleRequest .[[Attributes]] ,
[[Module]] : result .[[Value]] }를 referrer .[[LoadedModules]] 에 추가한다.
payload 가 GraphLoadingState Record 이면:
ContinueModuleLoading (payload ,
result )를 수행한다.
그 밖의 경우:
ContinueDynamicImport (payload ,
result )를 수행한다.
unused 를 반환한다.
16.2.1.12 AllImportAttributesSupported ( attributes )
AllImportAttributesSupported 추상 연산은 attributes (List of ImportAttribute Records )를 인자로 받아 불리언
값을 반환합니다. 호출 시 다음 절차를 수행합니다:
supported 를 HostGetSupportedImportAttributes ()로
설정한다.
attributes 의 각 ImportAttribute Record
attribute 에 대해:
supported 에 attribute .[[Key]] 가
없으면 false 를 반환한다.
true 를 반환한다.
16.2.1.12.1 HostGetSupportedImportAttributes ( )
HostGetSupportedImportAttributes 호스트 정의 추상 연산은 인자를 받지 않으며, 문자열의 List 를 반환합니다.
호스트
환경 이 지원하는 import attribute 키를 지정할 수 있게 합니다. 지원되는 키의 attribute만
호스트 에 제공됩니다.
HostGetSupportedImportAttributes의 구현체는 아래 요구사항을 따라야 합니다:
반환값은 지원되는 attribute를 나타내는 문자열의 List 여야 한다.
이 연산이 호출될 때마다 동일한 List 와 동일한 순서의
내용을 반환해야 한다.
HostGetSupportedImportAttributes의 기본 구현은 새로운 빈 List 를 반환하는 것이다.
참고
지원되지 않는 attribute를 호스트에 전달하고 호스트가 원하는 것만 처리하게 하는 대신, 호스트가
지원하는 import attribute를 명시적으로 지정하도록 요구하는 목적은 서로 다른
호스트 들 사이에서 지원되지 않는 attribute가 일관되게
처리되도록 하기 위함이다.
16.2.1.13 GetModuleNamespace ( module )
GetModuleNamespace 추상 연산은 module (모듈 레코드 의 구체적 하위 클래스
인스턴스)을 인자로 받아 모듈 네임스페이스 객체(Module Namespace Object)를 반환합니다. 이 객체는 module 의 export를
나타내며, 처음 요청 시 지연 생성되고, 이후 요청을 위해 module .[[Namespace]] 에
저장됩니다. 호출 시 다음 절차를 수행합니다:
Assert :
module 이 순환 모듈 레코드 인 경우
module .[[Status]] 는 new 또는
unlinked 가 아님을 확인한다.
namespace 를 module .[[Namespace]] 로
설정한다.
namespace 가 empty 이면:
exportedNames 를 module .GetExportedNames()로 설정한다.
unambiguousNames 를 새로운 빈 List 로
설정한다.
exportedNames 의 각 name 에 대해:
resolution 을
module .ResolveExport(name )로 설정한다.
resolution 이 ResolvedBinding
Record 이면, name 을
unambiguousNames 에 추가한다.
namespace 를 ModuleNamespaceCreate (module ,
unambiguousNames )로 설정한다.
namespace 를 반환한다.
참고
GetModuleNamespace는 예외를 throw하지 않습니다. 대신, 해결 불가능한 이름은 네임스페이스에서 단순히 제외됩니다. 실제 linking
오류는 나중에 발생하며, 단 ambiguous star export로만 구성되어 있고 명시적으로 요청되지 않을 경우에는 linking 오류가 나지 않을
수 있습니다.
16.2.1.14 런타임 의미론: 평가(Evaluation)
Module : [empty]
undefined 를 반환한다.
ModuleBody : ModuleItemList
result 를 Completion (Evaluation of ModuleItemList )로 설정한다.
result 가 정상 완료(normal
completion) 이고 result .[[Value]] 가 empty 이면:
undefined 를 반환한다.
? result 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
sl 를 ? Evaluation of
ModuleItemList 로
설정한다.
s 를 Completion (Evaluation of ModuleItem )로 설정한다.
? UpdateEmpty (s ,
sl )를 반환한다.
참고
ModuleItem : ImportDeclaration
empty 를 반환한다.
16.2.2 임포트
문법
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding
:
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
ImportsList
,
}
FromClause :
from
ModuleSpecifier
ImportsList :
ImportSpecifier
ImportsList
,
ImportSpecifier
ImportSpecifier :
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier [~Yield,
+Await]
WithClause :
with
{
}
with
{
WithEntries
,opt
}
WithEntries :
AttributeKey
:
StringLiteral
AttributeKey
:
StringLiteral
,
WithEntries
AttributeKey :
IdentifierName
StringLiteral
16.2.2.1 정적 의미론: 조기 오류
ModuleItem : ImportDeclaration
WithClause :
with
{
WithEntries
,opt
}
16.2.2.2 정적 의미론: ImportEntries
구문 지향 연산
ImportEntries는 인자가 없으며 List 형태의
ImportEntry Records 를 반환합니다. 다음의 각 생산 규칙에
대해 조각별로 정의됩니다:
Module : [empty]
새 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
entries1 을 ImportEntries of
ModuleItemList 로
한다.
entries2 를 ImportEntries of
ModuleItem 로 한다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ModuleItem :
ExportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ImportDeclaration
:
import
ImportClause
FromClause
WithClause opt
;
module 을 ModuleRequests of
ImportDeclaration 의 유일한 요소로 한다.
ImportEntriesForModule
of
ImportClause 에
module 인자를 넘겨 반환한다.
ImportDeclaration
:
import
ModuleSpecifier
WithClause opt
;
새 빈 List 를 반환한다.
16.2.2.3 정적 의미론: ImportEntriesForModule
구문 지향 연산
ImportEntriesForModule은 module ( ModuleRequest Record ) 인자를
받고 List 형태의 ImportEntry
Records 를 반환합니다. 다음의 각 생산 규칙에 대해 조각별로 정의됩니다:
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
entries1 을 ImportEntriesForModule
of ImportedDefaultBinding 에
module 인자를 넘겨서 얻는다.
entries2 를 ImportEntriesForModule
of NameSpaceImport 에 module
인자를 넘겨서 얻는다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ImportClause :
ImportedDefaultBinding
,
NamedImports
entries1 을 ImportEntriesForModule
of ImportedDefaultBinding 에
module 인자를 넘겨서 얻는다.
entries2 를 ImportEntriesForModule
of NamedImports 에
module 인자를 넘겨서 얻는다.
entries1 과 entries2 의 list-concatenation 을
반환한다.
ImportedDefaultBinding
: ImportedBinding
localName 을 BoundNames of ImportedBinding 의
유일한 요소로 한다.
defaultEntry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : "default" , [[LocalName]] : localName }로 한다.
« defaultEntry »를 반환한다.
NameSpaceImport
:
*
as
ImportedBinding
localName 을 StringValue of
ImportedBinding 로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : namespace-object ,
[[LocalName]] : localName }로 한다.
« entry »를 반환한다.
NamedImports :
{
}
새 빈 List 를 반환한다.
ImportsList :
ImportsList
,
ImportSpecifier
specs1 을 ImportEntriesForModule
of ImportsList 에
module 인자를 넘겨서 얻는다.
specs2 를 ImportEntriesForModule
of ImportSpecifier 에 module
인자를 넘겨서 얻는다.
specs1 과 specs2 의 list-concatenation 을
반환한다.
ImportSpecifier
: ImportedBinding
localName 을 BoundNames of ImportedBinding 의
유일한 요소로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : localName , [[LocalName]] : localName }로 한다.
« entry »를 반환한다.
ImportSpecifier
:
ModuleExportName
as
ImportedBinding
importName 을 StringValue of
ModuleExportName 로 한다.
localName 을 StringValue of
ImportedBinding 로 한다.
entry 를 ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName }로 한다.
« entry »를 반환한다.
16.2.2.4 정적 의미론: WithClauseToAttributes
구문 지향 연산
WithClauseToAttributes는 인자를 받지 않으며,
List 형태의 ImportAttribute Records 를 반환합니다. 아래의 각
생산 규칙별로 조각별로 정의됩니다:
WithClause :
with
{
}
새 빈 List 를 반환한다.
WithClause :
with
{
WithEntries
,opt
}
attributes 를 WithClauseToAttributes of
WithEntries 로 한다.
attributes 를 각 [[Key]] 필드의 값을 UTF-16 코드 유닛 시퀀스로
취급하여,
그 사전식(lexicographic) 순서대로 정렬한다. 참고: 이 정렬은 호스트 가
속성 열거 순서에 따라 동작을 변경하는 것이 금지됨을 관찰할 수 있을 뿐입니다.
attributes 를 반환한다.
WithEntries :
AttributeKey
:
StringLiteral
key 를 PropName of AttributeKey 로 한다.
entry 를 ImportAttribute Record { [[Key]] : key ,
[[Value]] : SV of StringLiteral }로 한다.
« entry »를 반환한다.
WithEntries :
AttributeKey
:
StringLiteral
,
WithEntries
key 를 PropName of AttributeKey 로 한다.
entry 를 ImportAttribute Record { [[Key]] : key ,
[[Value]] : SV of StringLiteral }로 한다.
rest 를 WithClauseToAttributes of
WithEntries 로 한다.
« entry »와 rest 의 list-concatenation 을
반환한다.
16.2.3 익스포트
문법
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield,
+Await]
export
Declaration [~Yield,
+Await]
export
default
HoistableDeclaration [~Yield,
+Await, +Default]
export
default
ClassDeclaration [~Yield,
+Await, +Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator here]
function , class }]
AssignmentExpression [+In,
~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
16.2.3.1 정적 의미론: 조기 오류
ExportDeclaration
:
export
NamedExports
;
참고
16.2.3.2 정적 의미론: ExportedBindings
구문 지향 연산
ExportedBindings는 인자를 받지 않으며 List 형태의
문자열을 반환합니다.
참고
ExportedBindings는 Module 의
ExportedNames 와
명시적으로 연결된 로컬 바인딩 이름입니다.
아래의 생산 규칙별로 조각별로 정의됩니다:
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 ExportedBindings
of ModuleItemList 로 한다.
names2 를 ExportedBindings
of ModuleItem 로 한다.
names1 과 names2 의 list-concatenation 을
반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
새 빈 List 를 반환한다.
ExportDeclaration
:
export
NamedExports
;
ExportedBindings
of NamedExports 를
반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
이 BoundNames of ExportDeclaration 를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ExportedBindings
of ExportsList 로 한다.
names2 를 ExportedBindings
of ExportSpecifier 로 한다.
names1 과 names2 의 list-concatenation 을
반환한다.
ExportSpecifier
: ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
첫 번째 ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
16.2.3.3 정적 의미론: ExportedNames
구문 지향 연산
ExportedNames는 인자를 받지 않으며 List 형태의
문자열을 반환합니다.
참고
ExportedNames는 Module 가
명시적으로 자신의 로컬 바인딩 이름 중 하나에 매핑한 외부적으로 보이는 이름들입니다.
아래의 생산 규칙별로 조각별로 정의됩니다:
ModuleItemList :
ModuleItemList
ModuleItem
names1 을 ExportedNames of
ModuleItemList 로
한다.
names2 를 ExportedNames of
ModuleItem 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ModuleItem : ExportDeclaration
ExportedNames of
ExportDeclaration 를 반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
ExportedNames of
ExportFromClause 를 반환한다.
ExportFromClause
: *
새 빈 List 를 반환한다.
ExportFromClause
:
*
as
ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportFromClause
: NamedExports
ExportedNames of
NamedExports 를
반환한다.
ExportDeclaration
:
export
VariableStatement
BoundNames of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
BoundNames of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
« "default" »를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ExportedNames of
ExportsList 로 한다.
names2 를 ExportedNames of
ExportSpecifier 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ExportSpecifier
: ModuleExportName
ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
두 번째 ModuleExportName 의 StringValue 만을 요소로
가지는 List 를 반환한다.
16.2.3.4 정적 의미론: ExportEntries
구문 지향 연산
ExportEntries는 인자를 받지 않으며 List 형태의
ExportEntry Records 를 반환합니다. 아래의 각 생산 규칙별로
조각별로 정의됩니다:
Module : [empty]
새 빈 List 를 반환한다.
ModuleItemList :
ModuleItemList
ModuleItem
entries1 을 ExportEntries of
ModuleItemList 로
한다.
entries2 를 ExportEntries of
ModuleItem 로 한다.
entries1 과 entries2 의 리스트 연결 을 반환한다.
ModuleItem :
ImportDeclaration
StatementListItem
새 빈 List 를 반환한다.
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
module 을 ModuleRequests of
ExportDeclaration 의 유일한 요소로 한다.
ExportEntriesForModule
of ExportFromClause 에
module 인자를 넘겨 반환한다.
ExportDeclaration
:
export
NamedExports
;
ExportEntriesForModule
of NamedExports 에
null 인자를 넘겨 반환한다.
ExportDeclaration
:
export
VariableStatement
entries 를 새 빈 List 로 한다.
names 를 BoundNames of VariableStatement 로 한다.
names 의 각 요소 name 에 대해,
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name }를
entries 에 추가한다.
entries 를 반환한다.
ExportDeclaration
:
export
Declaration
entries 를 새 빈 List 로 한다.
names 를 BoundNames of Declaration 로 한다.
names 의 각 요소 name 에 대해,
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name }를
entries 에 추가한다.
entries 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
names 를 BoundNames of HoistableDeclaration 로 한다.
localName 을 names 의 유일한 요소로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" }를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
names 를 BoundNames of ClassDeclaration 로
한다.
localName 을 names 의 유일한 요소로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" }를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
entry 를 ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : "*default*" , [[ExportName]] : "default" }로 한다.
« entry »를 반환한다.
참고
"*default*" 는 익명 기본 내보내기 값에 대해 이 명세에서 합성 이름으로 사용됩니다. 자세한 내용은
이 노트 를 참조하세요.
16.2.3.5 정적 의미론: ExportEntriesForModule
구문 지향 연산
ExportEntriesForModule은 module (ModuleRequest Record 또는
null ) 인자를 받고 List 형태의
ExportEntry Records 를 반환합니다. 아래 생산 규칙별로
조각별로 정의됩니다:
ExportFromClause
: *
entry 를 ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all-but-default , [[LocalName]] : null , [[ExportName]] : null }로 한다.
« entry »를 반환한다.
ExportFromClause
:
*
as
ModuleExportName
exportName 을 StringValue of
ModuleExportName 로 한다.
entry 를 ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all , [[LocalName]] : null , [[ExportName]] : exportName }로 한다.
« entry »를 반환한다.
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
specs1 을 ExportEntriesForModule
of ExportsList 에
module 인자를 넘겨서 얻는다.
specs2 를 ExportEntriesForModule
of ExportSpecifier 에 module
인자를 넘겨서 얻는다.
specs1 과 specs2 의 리스트 연결 을 반환한다.
ExportSpecifier
: ModuleExportName
sourceName 을 StringValue of
ModuleExportName 로 한다.
만약 module 이 null 이면,
localName 을 sourceName 으로 한다.
importName 을 null 로 한다.
그 외에는,
localName 을 null 로 한다.
importName 을 sourceName 으로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : sourceName }를 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
sourceName 을 첫 번째 ModuleExportName 의 StringValue 로 한다.
exportName 을 두 번째 ModuleExportName 의 StringValue 로 한다.
만약 module 이 null 이면,
localName 을 sourceName 으로 한다.
importName 을 null 로 한다.
그 외에는,
localName 을 null 로 한다.
importName 을 sourceName 으로 한다.
List 의 유일한 요소로
ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : exportName }를 반환한다.
16.2.3.6 정적 의미론: ReferencedBindings
구문 지향 연산
ReferencedBindings는 인자를 받지 않으며 List 형태의
파싱
노드 를 반환합니다. 아래의 각 생산 규칙별로 조각별로 정의됩니다:
NamedExports :
{
}
새 빈 List 를 반환한다.
ExportsList :
ExportsList
,
ExportSpecifier
names1 을 ReferencedBindings
of ExportsList 로 한다.
names2 를 ReferencedBindings
of ExportSpecifier 로 한다.
names1 과 names2 의 리스트 연결 을 반환한다.
ExportSpecifier
:
ModuleExportName
as
ModuleExportName
첫 번째 ReferencedBindings
of ModuleExportName 를 반환한다.
ModuleExportName
: IdentifierName
IdentifierName 만을
요소로 가지는 List 를 반환한다.
ModuleExportName
: StringLiteral
StringLiteral 만을
요소로 가지는 List 를 반환한다.
16.2.3.7 실행 시 의미론: 평가
ExportDeclaration
:
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
empty 를 반환한다.
ExportDeclaration
:
export
VariableStatement
? Evaluation of VariableStatement 를 반환한다.
ExportDeclaration
:
export
Declaration
? Evaluation of Declaration 를 반환한다.
ExportDeclaration
:
export
default
HoistableDeclaration
? Evaluation of HoistableDeclaration 를 반환한다.
ExportDeclaration
:
export
default
ClassDeclaration
value 를 ? BindingClassDeclarationEvaluation of
ClassDeclaration 로 한다.
className 을 BoundNames of ClassDeclaration 의
유일한 요소로 한다.
만약 className 이 "*default*" 이라면,
env 를 실행 중인 실행
컨텍스트 의 LexicalEnvironment로 한다.
? InitializeBoundName ("*default*" ,
value , env )를 수행한다.
empty 를 반환한다.
ExportDeclaration
:
export
default
AssignmentExpression
;
IsAnonymousFunctionDefinition (AssignmentExpression )이
true 이면,
value 를 ? NamedEvaluation of AssignmentExpression 에
"default" 인자를 넘겨서 얻는다.
그 외에는,
rhs 를 ? Evaluation
of AssignmentExpression 로
한다.
value 를 ? GetValue (rhs )로 한다.
env 를 실행 중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
? InitializeBoundName ("*default*" ,
value , env )를 수행한다.
empty 를 반환한다.
17 오류 처리 및 언어 확장
구현체는 대부분의 오류를 관련 ECMAScript 언어 구성요소가 평가되는 시점에 보고해야 한다. 조기 오류 란, 오류가 포함된 Script 내의 어떤 구성요소도 평가되기 전에 감지하고 보고할 수 있는 오류를 의미한다. 조기 오류 가 있으면 해당 구성요소의 평가가
이루어지지 않는다. 구현체는 Script 를 ParseScript 로 파싱하는 과정에서
조기 오류 를 반드시 보고해야 한다.
Module 내의 조기 오류 는 해당 Module 이 평가될 시점에 보고되며, Module 은 절대 초기화되지 않는다. eval 코드의 조기 오류 는 eval이
호출된 시점에 보고되며, eval 코드의 평가를 방지한다. 조기 오류 가 아닌 모든 오류는 런타임 오류다.
구현체는 이 명세의 “정적 의미론: 조기 오류” 하위 절에 나열된 조건이 발생하면 반드시 조기 오류 로 보고해야 한다.
구현체는 컴파일러가 어떤 구성요소가 어떤 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도, 다른 종류의 오류를 조기 오류 로 처리해서는 안 된다. 이러한 경우에는 조기 경고를 표시할 수 있지만,
관련 구성요소가 실제로 실행되기 전까지는 오류를 보고해서는 안 된다.
구현체는 다음을 제외하고 모든 오류를 명세된 대로 보고해야 한다:
17.1 에서 제한한 경우를 제외하고, 호스트 또는 구현체는 Script 문법, Module 문법, 그리고 정규식 패턴 또는 플래그 문법을 확장할 수 있다. 이를 허용하기 위해
eval 호출, 정규식 리터럴 사용, Function 또는 RegExp 생성자 사용 등 SyntaxError 를 던질 수 있는 모든 동작은,
스크립트 문법 또는 정규식 패턴/플래그 문법의 호스트
정의 확장을 만났을 때 SyntaxError 를 던지는 대신 호스트 정의 동작을 보일 수 있다.
17.1 에서 제한한 경우를 제외하고, 호스트 또는 구현체는 이 명세에 기술된 것 외의 추가 타입, 값, 객체, 프로퍼티, 함수
등을 제공할 수 있다. 이로 인해 (예: 전역 스코프에서 변수 조회 등) 일부 구성요소가 오류(예: ReferenceError )를 던지는 대신
호스트 정의 동작을 할 수
있다.
17.1 금지된 확장
구현체는 다음과 같이 이 명세를 확장해서는 안 된다:
엄격 모드
코드 에서 생성자 문법을 사용해 정의된 ECMAScript 함수 객체 에
"caller" 또는 "arguments" 라는 자체 프로퍼티를 생성해서는 안 된다. 이러한 자체
프로퍼티는 ArrowFunction , MethodDefinition , GeneratorDeclaration ,
GeneratorExpression ,
AsyncGeneratorDeclaration , AsyncGeneratorExpression , ClassDeclaration , ClassExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncArrowFunction 으로 정의된
함수
객체 에도 생성되어서는 안 되며, 정의가 엄격 모드 코드 에 포함되어 있는지 여부와 관계없다.
내장 함수, Function 생성자 로 생성된 엄격 함수 , Generator 생성자 로 생성된 generator
함수, AsyncFunction 생성자 로 생성된 async 함수, bind 메서드로 생성된 함수 역시
이러한 자체 프로퍼티를 생성하면 안 된다.
어떤 구현체가 함수
객체 에 "caller" 라는 자체 프로퍼티를 확장한다면, [[Get]] 또는 [[GetOwnProperty]] 로 관찰되는 그 값은
엄격 함수
객체가 아니어야 한다. 만약 그 프로퍼티가 접근자 프로퍼티 라면, 그 [[Get]]
속성의 함수는 호출될 때 절대 엄격
함수 를 반환해서는 안 된다.
매핑된 또는 매핑되지 않은 arguments 객체 모두 "caller" 라는 자체 프로퍼티를 생성해서는 안 된다.
ECMA-402에 지정된 내장 메서드(예: toLocaleString)의 동작은 ECMA-402에 명시된 경우를 제외하고 확장해서는 안 된다.
22.2.1 및
B.1.2 의 RegExp 패턴 문법은
[UnicodeMode] 문법 파라미터가 있을 때 IdentityEscape [+UnicodeMode] 로
소스 문자 A-Z 또는 a-z를 인식하도록 확장되어서는 안 된다.
구문 문법(Syntactic Grammar)은 BindingIdentifier 비종단기호로 일치하는 소스 텍스트 바로 뒤에
: 토큰이 올 수 있도록 어떤 방식으로든 확장되어서는 안 된다.
엄격 모드
코드 처리 시 12.9.3.1 의
조기 오류 규칙을
완화해서는 안 된다.
TemplateEscapeSequence 를 12.9.4 에서 정의된 LegacyOctalEscapeSequence 또는 NonOctalDecimalEscapeSequence 를
포함하도록 확장해서는 안 된다.
엄격 모드
코드 처리 시 B.3.1 , B.3.2 ,
B.3.3 ,
B.3.5 에서 정의된 확장 기능을
지원해서는 안 된다.
Module 목표
기호(goal symbol) 파싱 시 B.1.1 에 정의된 렉시컬 문법 확장 기능을
지원해서는 안 된다.
ImportCall 을 확장해서는 안 된다.
18 ECMAScript 표준 내장 객체
특정 내장 객체들은 ECMAScript Script 또는 Module 이 실행을 시작할 때마다 사용할 수 있습니다. 그 중 글로벌 객체 는 실행 중인
프로그램의 글로벌 환경의 일부입니다. 다른 객체들은 글로벌 객체 의 초기 프로퍼티 또는 접근 가능한 내장 객체의 프로퍼티로 간접적으로 접근할 수
있습니다.
별도의 명시가 없는 한, 함수로 호출 가능한 내장 객체는 함수 객체 이며, 10.3 에서 설명된 특성을 가집니다. 별도의 명시가
없는 한, 내장 객체의 [[Extensible]] 내부 슬롯의 초기 값은 true 입니다. 모든 내장
함수 객체 는 [[Realm]] 내부 슬롯을 가지며, 그 값은 해당 객체가 처음 생성된 Realm Record 의 realm 입니다.
많은 내장 객체들은 함수입니다: 이들은 인자를 넘겨서 호출할 수 있습니다. 그 중 일부는 생성자 이기도 하며, new 연산자와 함께 사용하기 위한 함수입니다. 각 내장 함수에
대해 이 명세는 그 함수가 요구하는 인자와 해당 함수 객체 의 프로퍼티를 설명합니다. 각 내장 생성자 에 대해서도, 해당 생성자 의 프로토타입 객체의 프로퍼티와, 해당 생성자 를 호출하는 new
표현식이 반환하는 특정 객체 인스턴스의 프로퍼티를 설명합니다.
특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자 에 필요한 인자보다 적은 인자가 주어지면, 해당 함수 또는 생성자 는 부족한 인자 각각에 대해
undefined 값을 추가로 받은 것처럼 동작해야 합니다. 이러한 누락된 인자들은 “존재하지 않음”으로 간주되며, 명세 알고리즘에서 그렇게 식별될 수
있습니다. 특정 함수의 설명에서 “this 값”과 “NewTarget” 용어는 10.3 에서 정의된 의미를 가집니다.
특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자 에 정의된 허용 인자보다 더 많은 인자가 주어지면, 추가 인자들은 호출 시 평가되지만 함수에서는
무시됩니다. 하지만 구현체는 그러한 인자에 대해 구현체 고유의 동작을 정의할 수 있으며, 그 동작이 단순히 추가 인자가 존재한다는 이유로
TypeError 예외를 던지는 것이 아닌 한 허용됩니다.
참고 1
내장 함수 집합에 추가적인 기능을 더하는 구현체는 기존 함수에 새로운 파라미터를 추가하기보다는 새로운 함수를 추가하는 방식이 권장됩니다.
별도의 명시가 없는 한, 모든 내장 함수와 모든 내장 생성자 는 Function 프로토타입 객체 를 [[Prototype]] 내부 슬롯의 값으로 가지며, 이는 Function.prototype (20.2.3 )의 초기 값입니다.
별도의 명시가 없는 한, 모든 내장 프로토타입 객체는 Object 프로토타입
객체 를 [[Prototype]] 내부 슬롯의 값으로 가지며, 이는
Object.prototype (20.1.3 )의 초기
값입니다. 단, Object 프로토타입 객체 자체는 예외입니다.
이 명세가 내장 생성자 의 동작을 알고리즘
단계로 정의하는 경우, 이는 [[Call]] 및 [[Construct]] 양쪽 모두에 대한
동작입니다. 만약 그런 알고리즘이 두 경우를 구분할 필요가 있으면, NewTarget이 undefined 인지 검사하며, 이는 [[Call]] 호출임을 나타냅니다.
생성자로 식별되지 않은 내장 함수
객체 는 별도의 명시가 없는 한 [[Construct]] 내부 메서드를 구현하지 않습니다.
생성자가 아닌 내장 함수
객체 는 별도의 명시가 없는 한 "prototype" 프로퍼티를 가지지 않습니다.
이 명세에서 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산 (10.3.4 )을 호출하여 생성됩니다. length 와
name 파라미터의 값은 아래에서 논의된 대로 "length" 및 "name" 프로퍼티의 초기
값입니다. prefix 파라미터의 값도 아래에서 논의됩니다.
모든 내장 함수
객체 (생성자 포함)는 "length" 프로퍼티를 가지며, 그 값은 음수가 아닌 정수 Number 입니다. 별도의
명시가 없는 한, 이 값은 함수 설명의 하위 절 제목에 표시된 필수 파라미터의 수입니다. 선택적 파라미터와 rest 파라미터는 파라미터 수에 포함되지 않습니다.
참고 2
예를 들어, 함수
객체 로서 "map" 프로퍼티의 초기 값인 Array 프로토타입 객체 는
«Array.prototype.map (callback [ , thisArg])»라는 하위 절 제목 아래에 설명되어 있습니다. 여기서 두 인자 callback과
thisArg가 있는데, 후자는 선택적입니다. 따라서 해당 함수 객체 의 "length" 프로퍼티 값은
1 𝔽 입니다.
별도의 명시가 없는 한, 내장 함수
객체 의 "length" 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다.
모든 내장 함수
객체 (생성자 포함)는 "name" 프로퍼티를 가지며, 그 값은 문자열 입니다. 별도의 명시가 없는 한, 이 값은 이
명세에서 함수에 부여된 이름입니다. 익명 함수로 지정된 함수는 "name" 프로퍼티의 값으로 빈 문자열을 사용합니다. 객체의 프로퍼티로 지정된 함수의
경우, name 값은 해당 함수를 접근하는 프로퍼티
이름 문자열입니다. 내장 프로퍼티의 getter 또는 setter 함수로 지정된 함수는 prefix 파라미터에 각각
"get" 또는 "set" 을 전달합니다(CreateBuiltinFunction 호출 시).
프로퍼티 키 가 심볼(Symbol) 값일 때, 각 내장 함수의
"name" 프로퍼티의 값은 명시적으로 지정됩니다. 만약 명시적으로 지정된 값이 "get " 또는
"set " 로 시작하며, 해당 함수가 내장 프로퍼티의 getter 또는 setter 함수라면, prefix를 제외한 값이 name
파라미터로 전달되고, "get" 또는 "set" 이 prefix 파라미터로
전달됩니다(CreateBuiltinFunction 호출 시).
별도의 명시가 없는 한, 내장 함수
객체 의 "name" 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다.
19 에서
28 까지의 절 및 부록
B.2 에서 설명된 모든 기타 데이터 프로퍼티 는 별도의 명시가
없는 한 { [[Writable]] : true , [[Enumerable]] :
false , [[Configurable]] : true } 속성을 가집니다.
19 에서
28 까지의 절 및 부록
B.2 에서 설명된 모든 접근자 프로퍼티 는 별도의 명시가
없는 한 { [[Enumerable]] : false , [[Configurable]] : true } 속성을 가집니다. getter 함수만 설명된 경우 setter
함수는 기본값 undefined 입니다. setter만 설명된 경우 getter는 기본값 undefined 입니다.
19 글로벌 객체
글로벌 객체 :
어떤 실행
컨텍스트 에 진입하기 전에 생성됩니다.
[[Construct]] 내부 메서드를 가지고 있지 않으며, new 연산자와 함께 생성자 로 사용할 수 없습니다.
[[Call]] 내부 메서드를 가지고 있지 않으며, 함수로 호출될 수 없습니다.
[[Prototype]] 내부 슬롯의 값은 호스트 정의 입니다.
이 명세서에 정의된 속성 외에도 호스트
정의 속성을 추가로 가질 수 있습니다. 여기에는 값이 글로벌 객체 자체인 속성이 포함될 수 있습니다.
19.1 글로벌 객체의 값 속성
19.1.1 globalThis
글로벌
객체 의 "globalThis" 속성의 초기 값은 Realm Record
realm 에서 realm .[[GlobalEnv]] .[[GlobalThisValue]] 입니다.
이 속성의 특성은 { [[Writable]] :
true , [[Enumerable]] : false , [[Configurable]] : true }입니다.
19.1.2 Infinity
Infinity의 값은 +∞ 𝔽 입니다 (6.1.6.1 참조). 이 속성의 특성은
{ [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }입니다.
19.1.3 NaN
NaN의 값은 NaN 입니다 (6.1.6.1 참조). 이 속성의 특성은
{ [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }입니다.
19.1.4 undefined
undefined의 값은 undefined 입니다 (6.1.1 참조). 이 속성의 특성은
{ [[Writable]] : false ,
[[Enumerable]] : false , [[Configurable]] : false }입니다.
19.2 글로벌 객체의 함수 속성
19.2.1 eval ( x )
이 함수는 %eval% 내장 객체입니다.
호출될 때 다음 단계를 수행합니다:
? PerformEval (x ,
false , false )을 반환합니다.
19.2.1.1 PerformEval ( x , strictCaller ,
direct )
추상 연산 PerformEval은 x (ECMAScript 언어 값 ),
strictCaller (불리언), direct (불리언) 인자를 받고,
정상 완료 로
ECMAScript 언어 값
또는 throw 완료 를 반환합니다. 호출
시 다음 단계를 수행합니다:
Assert :
direct 가 false 이면 strictCaller 도
false 입니다.
x 가 문자열이
아니면 , x 를 반환합니다.
evalRealm 을 현재 Realm Record 로 둡니다.
참고: 직접
eval 의 경우, evalRealm 은 realm 이며, eval 호출자와
eval 함수 자체에 해당합니다.
? HostEnsureCanCompileStrings (evalRealm ,
« », x , direct )를 수행합니다.
inFunction 을 false 로 둡니다.
inMethod 을 false 로 둡니다.
inDerivedConstructor 을 false 로 둡니다.
inClassFieldInitializer 을 false 로 둡니다.
direct 가 true 이면
thisEnvRec 을 GetThisEnvironment ()로
둡니다.
thisEnvRec 이 함수 환경
레코드 라면
F 를 thisEnvRec .[[FunctionObject]] 로 둡니다.
inFunction 을 true 로 설정합니다.
inMethod 를 thisEnvRec .HasSuperBinding()으로
설정합니다.
F .[[ConstructorKind]] 가
derived 이면, inDerivedConstructor 를
true 로 설정합니다.
classFieldInitializerName 을 F .[[ClassFieldInitializerName]] 로 둡니다.
classFieldInitializerName 이 empty 가
아니면 inClassFieldInitializer 를 true 로
설정합니다.
다음 하위 단계를 구현 정의 순서로, 파싱과 오류 감지를 교차하면서
수행합니다:
script 를 ParseText (x , Script )로 둡니다.
script 가 오류
리스트 이면, SyntaxError 예외를 throw합니다.
script Contains
ScriptBody 가
false 이면, undefined 를 반환합니다.
body 를 script 의 ScriptBody 로 둡니다.
inFunction 이 false 이고 body
Contains
NewTarget 가
있으면, SyntaxError 예외를 throw합니다.
inMethod 이 false 이고 body
Contains
SuperProperty 가 있으면,
SyntaxError 예외를 throw합니다.
inDerivedConstructor 가 false 이고
body Contains
SuperCall 가
있으면, SyntaxError 예외를 throw합니다.
inClassFieldInitializer 이 true 이고
ContainsArguments 의
body 가 true 이면, SyntaxError
예외를 throw합니다.
strictCaller 가 true 이면, strictEval 을
true 로 둡니다.
그렇지 않으면, strictEval 을 ScriptIsStrict 의
script 값으로 둡니다.
runningContext 를 실행 중인 실행
컨텍스트 로 둡니다.
참고: direct 가 true 이면, runningContext 는
실행 컨텍스트 이며,
직접
eval 을 수행한 컨텍스트입니다. direct 가
false 이면, runningContext 는 eval 함수 호출을 위한
실행 컨텍스트 입니다.
direct 가 true 이면
lexEnv 를 NewDeclarativeEnvironment (runningContext 의
LexicalEnvironment)로 둡니다.
varEnv 를 runningContext 의 VariableEnvironment로 둡니다.
privateEnv 를 runningContext 의 PrivateEnvironment로 둡니다.
그렇지 않으면,
lexEnv 를 NewDeclarativeEnvironment (evalRealm .[[GlobalEnv]] )로 둡니다.
varEnv 를 evalRealm .[[GlobalEnv]] 로 둡니다.
privateEnv 를 null 로 둡니다.
strictEval 이 true 이면, varEnv 를
lexEnv 로 설정합니다.
runningContext 가 이미 suspend되지 않았다면, runningContext 를 suspend합니다.
evalContext 를 새로운 ECMAScript 코드 실행
컨텍스트 로 둡니다.
evalContext 의 Function을 null 로 설정합니다.
evalContext 의 Realm 을 evalRealm 으로 설정합니다.
evalContext 의 ScriptOrModule을 runningContext 의 ScriptOrModule로
설정합니다.
evalContext 의 VariableEnvironment를 varEnv 로 설정합니다.
evalContext 의 LexicalEnvironment를 lexEnv 로 설정합니다.
evalContext 의 PrivateEnvironment를 privateEnv 로 설정합니다.
evalContext 를 실행 컨텍스트 스택 에 push합니다;
evalContext 는 이제 실행 중인 실행
컨텍스트 입니다.
result 를 Completion (EvalDeclarationInstantiation (body ,
varEnv , lexEnv , privateEnv ,
strictEval ))로 둡니다.
result 가 정상
완료 이면,
result 를 Completion (Evaluation 의 body )로
설정합니다.
result 가 정상
완료 이고 result .[[Value]] 가
empty 이면,
result 를 NormalCompletion (undefined )로
설정합니다.
evalContext 를 suspend 시키고 실행 컨텍스트 스택 에서
제거합니다.
이제 실행 컨텍스트 스택 맨 위에 있는 컨텍스트를
실행 중인 실행 컨텍스트 로 복구합니다.
? result 를 반환합니다.
참고
eval 코드가 호출 컨텍스트의 변수 환경에 변수나 함수 바인딩을 생성할 수 없는 경우는, 호출 컨텍스트의 코드나 eval 코드가 엄격
모드 코드 인 경우입니다.
대신 이러한 바인딩은 eval 코드에서만 접근 가능한 새로운 VariableEnvironment에서 생성됩니다. let,
const, class 선언을 통해 도입된 바인딩은 항상 새로운 LexicalEnvironment에서
생성됩니다.
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm ,
parameterStrings , bodyString , direct )
호스트 정의
추상 연산 HostEnsureCanCompileStrings는 calleeRealm (Realm Record ),
parameterStrings (문자열
리스트 ), bodyString (문자열), direct (불리언)을 인자로 받고,
정상 완료 로
unused 또는 throw
완료 를 반환합니다. 이 연산은 호스트 환경 이 개발자가 문자열을 ECMAScript 코드로 해석·평가할 수 있게
하는 특정 ECMAScript 함수를 차단할 수 있도록 합니다.
parameterStrings 는 생성자 중 하나를 사용할 때 매개변수 리스트를 구성하기 위해 연결되는 문자열들을
나타냅니다. bodyString 은 함수 본문이나 eval 호출에 전달되는 문자열을 나타냅니다.
direct 는 평가가 직접
eval 인지 여부를 나타냅니다.
HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion (unused )을
반환하는 것입니다.
19.2.1.3 EvalDeclarationInstantiation ( body ,
varEnv , lexEnv , privateEnv , strict )
추상 연산 EvalDeclarationInstantiation은 body (ScriptBody 구문
노드 ), varEnv (Environment Record ),
lexEnv (Declarative Environment
Record ), privateEnv (PrivateEnvironment Record 또는
null ), strict (불리언) 인자를 받고, 정상 완료 로
unused 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
varNames 를 body 의 VarDeclaredNames 로
둡니다.
varDeclarations 를 body 의 VarScopedDeclarations 로
둡니다.
strict 가 false 이면
varEnv 가 Global
Environment Record 라면
varNames 의 각 name 에 대해
HasLexicalDeclaration (varEnv ,
name )가 true 이면,
SyntaxError 예외를 throw합니다.
참고: eval은 전역 렉시컬 선언에 의해 가려지는 전역 var 선언을 생성하지
않습니다.
thisEnv 를 lexEnv 로 둡니다.
Assert : 다음 루프는 종료됩니다.
다음이 참인 동안 반복합니다: thisEnv 와 varEnv 가 같은 Environment Record 가
아님
thisEnv 가 객체가 아니고
Environment
Record 라면
참고: with 문의 환경은 어떠한 렉시컬 선언도 포함할 수 없으므로 var/let 호이스팅 충돌을 검사할
필요가 없습니다.
varNames 의 각 name 에 대해
! thisEnv .HasBinding(name )이
true 라면
SyntaxError 예외를 throw합니다.
참고: 부록 B.3.4 는
위 단계에 대해 대체 의미론을 정의합니다.
참고: 직접
eval 은 이름이 같은 렉시컬 선언 위로 var
선언을 호이스팅하지 않습니다.
thisEnv 를 thisEnv .[[OuterEnv]] 로 설정합니다.
privateIdentifiers 를 새로운 빈 리스트 로 둡니다.
pointer 를 privateEnv 로 둡니다.
pointer 가 null 이 아닐 동안 반복합니다,
pointer .[[Names]] 의 각 Private Name
binding 에 대해
privateIdentifiers 에 binding .[[Description]] 이 없다면,
binding .[[Description]] 을
privateIdentifiers 에 추가합니다.
pointer 를 pointer .[[OuterPrivateEnvironment]] 로 설정합니다.
AllPrivateIdentifiersValid 의
body 와 인자 privateIdentifiers 가 false 라면,
SyntaxError 예외를 throw합니다.
functionsToInitialize 를 새로운 빈 리스트 로 둡니다.
declaredFunctionNames 를 새로운 빈 리스트 로 둡니다.
varDeclarations 의 각 d 에 대해, 리스트를 역순으로 처리합니다
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 어느
것도 아니면
Assert : d 는 FunctionDeclaration ,
GeneratorDeclaration ,
AsyncFunctionDeclaration ,
AsyncGeneratorDeclaration
중 하나입니다.
참고: 동일한 이름의 함수 선언이 여러 개 있으면, 마지막 선언이 사용됩니다.
fn 을 d 의 BoundNames 의
유일한 요소로 둡니다.
declaredFunctionNames 에 fn 이 없다면,
varEnv 가 Global
Environment Record 라면
fnDefinable 을 ? CanDeclareGlobalFunction (varEnv ,
fn )로 둡니다.
fnDefinable 이 false 이면,
TypeError 예외를 throw합니다.
fn 을 declaredFunctionNames 에 추가합니다.
d 를 functionsToInitialize 의 첫 번째 요소로
삽입합니다.
declaredVarNames 를 새로운 빈 리스트 로 둡니다.
varDeclarations 의 각 d 에 대해
d 가 VariableDeclaration ,
ForBinding ,
BindingIdentifier 중 하나라면
d 의 BoundNames 의
각 문자열 vn 에 대해
declaredFunctionNames 에 vn 이 없다면,
varEnv 가 Global
Environment Record 라면
vnDefinable 을 ? CanDeclareGlobalVar (varEnv ,
vn )로 둡니다.
vnDefinable 이
false 이면,
TypeError 예외를 throw합니다.
declaredVarNames 에 vn 이 없다면,
vn 을 declaredVarNames 에
추가합니다.
참고: 부록 B.3.2.3 가
이 지점에 추가 단계를 포함합니다.
참고: 이 알고리즘 단계 이후에는
varEnv 가 Global Environment
Record 이고 글로벌 객체 가 프록시 이국
객체 인 경우가 아니면 비정상 종료가 발생하지 않습니다.
lexDeclarations 를 body 의 LexicallyScopedDeclarations 로
둡니다.
lexDeclarations 의 각 d 에 대해
참고: 렉시컬로 선언된 이름은 여기서 인스턴스화만 되고 초기화되지는 않습니다.
d 의 BoundNames 의 각
dn 에 대해
IsConstantDeclaration 의
d 가 true 이면,
? lexEnv .CreateImmutableBinding(dn ,
true )를 수행합니다.
그렇지 않으면,
? lexEnv .CreateMutableBinding(dn ,
false )를 수행합니다.
functionsToInitialize 의 각 구문 노드
f 에 대해
fn 을 f 의 BoundNames 의
유일한 요소로 둡니다.
fo 를 f 의 InstantiateFunctionObject 와
인자 lexEnv , privateEnv 로 둡니다.
varEnv 가 Global
Environment Record 라면
? CreateGlobalFunctionBinding (varEnv ,
fn , fo , true )를 수행합니다.
그렇지 않으면,
bindingExists 를
! varEnv .HasBinding(fn )로 둡니다.
bindingExists 가 false 이면,
참고: 아래 호출은 비정상
완료 를 반환할 수 없습니다. 이는 14
이전의 검증 때문입니다.
! varEnv .CreateMutableBinding(fn ,
true )를 수행합니다.
! varEnv .InitializeBinding(fn ,
fo )를 수행합니다.
그렇지 않으면,
! varEnv .SetMutableBinding(fn ,
fo , false )를 수행합니다.
declaredVarNames 의 각 문자열 vn 에 대해
varEnv 가 Global
Environment Record 라면
? CreateGlobalVarBinding (varEnv ,
vn , true )를 수행합니다.
그렇지 않으면,
bindingExists 를
! varEnv .HasBinding(vn )로 둡니다.
bindingExists 가 false 이면,
참고: 아래 호출은 비정상
완료 를 반환할 수 없습니다. 이는 14
이전의 검증 때문입니다.
! varEnv .CreateMutableBinding(vn ,
true )를 수행합니다.
! varEnv .InitializeBinding(vn ,
undefined )를 수행합니다.
unused 를 반환합니다.
참고
이 알고리즘의 대체 버전은 B.3.4 에 설명되어
있습니다.
19.2.2 isFinite ( number )
이 함수는 %isFinite% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
num 을 ? ToNumber (number )로 둡니다.
num 이 finite 가 아니면, false 를 반환합니다.
그렇지 않으면, true 를 반환합니다.
19.2.3 isNaN ( number )
이 함수는 %isNaN% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
num 을 ? ToNumber (number )로 둡니다.
num 이 NaN 이면, true 를 반환합니다.
그렇지 않으면, false 를 반환합니다.
참고
ECMAScript 코드에서 값 X가 NaN 인지 신뢰성 있게 검사하는 방법은
X !== X 형태의 표현식을 사용하는 것입니다. X가 NaN 일 때만 결과가
true 가 됩니다.
19.2.4 parseFloat ( string )
이 함수는 string 인자의 내용을 10진수 리터럴로 해석하여 Number 값을 생성합니다.
이 함수는 %parseFloat% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
inputString 을 ? ToString (string )로 둡니다.
trimmedString 을 ! TrimString (inputString ,
start )로 둡니다.
trimmed 을 StringToCodePoints (trimmedString )로
둡니다.
trimmedPrefix 를 trimmed 의 접두사 중 StrDecimalLiteral 의 문법을 만족하는 가장 긴
접두사로 둡니다. 이 값은 trimmed 자체일 수도 있습니다. 만약 그런 접두사가 없다면 NaN 를
반환합니다.
parsedNumber 를 ParseText (trimmedPrefix , StrDecimalLiteral )로
둡니다.
Assert :
parsedNumber 는 구문 노드 입니다.
parsedNumber 의 StringNumericValue 를
반환합니다.
참고
이 함수는 string 의 앞부분만 Number 값으로 해석할 수 있으며, 10진수 리터럴 표기법의 일부로 해석할 수 없는 코드 유닛들은
무시되고, 이러한 코드 유닛이 무시되었다는 표시가 제공되지 않습니다.
19.2.5 parseInt ( string , radix )
이 함수는 지정된 radix 에 따라 string 의 내용을 해석하여 정수 Number 값을 생성합니다.
string 의 선행 공백은 무시됩니다. radix 가 0으로 변환될 경우(undefined 일 때
등), 숫자 표기가 "0x" 또는 "0X" 로 시작하지 않는 한 10으로 간주합니다.
radix 가 16이면 숫자 표기는 "0x" 또는 "0X" 로 시작할 수 있습니다.
이 함수는 %parseInt% 내장 객체입니다.
호출될 때 다음 단계들을 수행합니다:
inputString 을 ? ToString (string )로 둡니다.
S 를 ! TrimString (inputString ,
start )로 둡니다.
sign 을 1로 둡니다.
S 가 비어 있지 않고 첫 코드 유닛이 0x002D(HYPHEN-MINUS)라면 sign 을 -1로 설정합니다.
S 가 비어 있지 않고 첫 코드 유닛이 0x002B(PLUS SIGN) 또는 0x002D(HYPHEN-MINUS)라면,
S 를 인덱스 1부터의 substring 로 둡니다.
R 을 ℝ (?
ToInt32 (radix ))로 둡니다.
stripPrefix 를 true 로 둡니다.
R ≠ 0이면,
R < 2 또는 R > 36이면 NaN 를 반환합니다.
R ≠ 16이면 stripPrefix 를 false 로 설정합니다.
그렇지 않으면,
R 을 10으로 설정합니다.
stripPrefix 가 true 면,
S 의 길이가 2 이상이고 처음 두 코드 유닛이 "0x" 또는
"0X" 라면,
S 를 인덱스 2부터의 substring 로 둡니다.
R 을 16으로 설정합니다.
S 가 radix-R 숫자가 아닌 코드 유닛을 포함하면, end 를 해당 코드 유닛의 인덱스로 둡니다.
그렇지 않으면 end 를 S 의 길이로 둡니다.
Z 를 S 의 0부터 end 까지의 substring 로 둡니다.
Z 가 비어 있으면 NaN 를 반환합니다.
mathInt 를 Z 가 radix-R 표기법으로 나타내는 정수 값으로 둡니다. 이때 값
10~35에 해당하는 숫자는 A ~Z 와 a ~z 로 표시됩니다. (R = 10이고
Z 에 20개를 초과하는 유효 숫자가 있으면, 20번째 이후의 모든 유효 숫자는 구현에 따라 0으로 대체할 수 있습니다.
R 이 2,4,8,10,16,32 중 하나가 아니면 mathInt 는 구현 근사 정수 일 수 있습니다.)
mathInt = 0이면,
sign = -1이면 -0 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
𝔽 (sign ×
mathInt )를 반환합니다.
참고
이 함수는 string 의 앞부분만 정수 값으로 해석할 수 있으며, 정수 표기법 일부로 해석할 수 없는 코드 유닛은
무시되고, 무시되었다는 표시가 제공되지 않습니다.
19.2.6 URI 처리 함수
Uniform Resource Identifiers, 즉 URI는 인터넷에서 자원(예: 웹 페이지 또는 파일)과 이를 접근하는 전송 프로토콜(예: HTTP 또는 FTP)을
식별하는 문자열입니다. ECMAScript 언어 자체는 이 절에서 설명된 URI를 인코드 및 디코드하는 함수 외에는 URI를 사용하는 지원을 제공하지 않습니다.
encodeURI와 decodeURI는 전체 URI에 사용하도록 설계되어 있으며, 예약 문자가 특별한 의미(예: 구분자)를
가진 것으로 간주하므로 인코드하지 않습니다. encodeURIComponent와 decodeURIComponent는 URI의
개별 구성요소에 사용하도록 설계되어 있으며, 예약 문자가 텍스트로 간주되어 전체 URI의 일부가 될 때 특별한 의미를 방지하기 위해 인코딩되어야 합니다.
참고 1
예약 문자 집합은 RFC 2396을 기반으로 하며, 이후의 RFC 3986에서 도입된 변경 사항을 반영하지 않습니다.
참고 2
많은 ECMAScript 구현체는 웹 페이지를 조작하는 추가 함수 및 메서드를 제공합니다. 이러한 함수들은 이 표준의 범위를 벗어납니다.
19.2.6.1 decodeURI ( encodedURI )
이 함수는 encodeURI 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드 포인트의 UTF-16
인코딩으로 대체한 새로운 URI 버전을 계산합니다. encodeURI에 의해 도입될 수 없는 이스케이프 시퀀스는 대체되지 않습니다.
이 함수는 %decodeURI% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
uriString 을 ? ToString (encodedURI )로 둡니다.
preserveEscapeSet 을 ";/?:@&=+$,#" 로 둡니다.
? Decode (uriString ,
preserveEscapeSet )를 반환합니다.
19.2.6.2 decodeURIComponent ( encodedURIComponent )
이 함수는 encodeURIComponent 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드
포인트의 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산합니다.
이 함수는 %decodeURIComponent% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
componentString 을 ? ToString (encodedURIComponent )로
둡니다.
preserveEscapeSet 을 빈 문자열로 둡니다.
? Decode (componentString ,
preserveEscapeSet )를 반환합니다.
19.2.6.3 encodeURI ( uri )
이 함수는 UTF-16으로 인코딩된 (6.1.4 )
URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을
계산합니다.
이 함수는 %encodeURI% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
uriString 을 ? ToString (uri )로 둡니다.
extraUnescaped 를 ";/?:@&=+$,#" 로 둡니다.
? Encode (uriString ,
extraUnescaped )를 반환합니다.
19.2.6.4 encodeURIComponent ( uriComponent )
이 함수는 UTF-16으로 인코딩된 (6.1.4 )
URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을
계산합니다.
이 함수는 %encodeURIComponent% 내장 객체입니다.
호출 시 다음 단계를 수행합니다:
componentString 을 ? ToString (uriComponent )로 둡니다.
extraUnescaped 를 빈 문자열로 둡니다.
? Encode (componentString ,
extraUnescaped )를 반환합니다.
19.2.6.5 Encode ( string , extraUnescaped )
추상 연산 Encode는 string (문자열)과 extraUnescaped (문자열) 인자를 받고, 정상 완료 로 문자열 또는
throw 완료 를 반환합니다. URI
인코딩 및 이스케이프를 수행하며, string 을 6.1.4 에서 설명된 UTF-16
인코딩 코드 포인트 시퀀스로 해석합니다. 문자가 RFC 2396에서 예약되지 않은 것으로 판별되거나 extraUnescaped 에 나타나면
이스케이프되지 않습니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
R 을 빈 문자열로 둡니다.
alwaysUnescaped 를 문자열 연결 로 ASCII 단어 문자 와
"-.!~*'()" 의 연결로 둡니다.
unescapedSet 을 문자열 연결 로
alwaysUnescaped 와 extraUnescaped 의 연결로 둡니다.
k 를 0으로 둡니다.
k < len 인 동안 반복합니다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 둡니다.
unescapedSet 에 C 가 포함되어 있으면,
k 를 k + 1로 설정합니다.
R 을 문자열
연결 로 R 과 C 의 연결로 설정합니다.
그렇지 않으면,
cp 를 CodePointAt (string ,
k )로 둡니다.
cp .[[IsUnpairedSurrogate]] 가
true 이면 URIError 예외를 throw합니다.
k 를 k + cp .[[CodeUnitCount]] 로 설정합니다.
Octets 를 리스트 로
cp .[[CodePoint]] 에 UTF-8 변환을 적용하여
얻은 옥텟들로 둡니다.
Octets 의 각 octet 에 대해,
hex 를 octet 의 문자열 표현으로, 대문자 16진수로 포맷합니다.
R 을 문자열
연결 로 R ,
"%" , StringPad (hex ,
2, "0" , start )의
연결로 설정합니다.
R 를 반환합니다.
참고
퍼센트 인코딩은 개별 옥텟을 나타내는 데 사용되므로, 하나의 코드 포인트가 여러 연속 이스케이프 시퀀스(각각 8비트 UTF-8 코드 유닛 하나씩)로
표현될 수 있습니다.
19.2.6.6 Decode ( string ,
preserveEscapeSet )
추상 연산 Decode는 string (문자열)과 preserveEscapeSet (문자열) 인자를 받고, 정상 완료 로 문자열 또는
throw 완료 를 반환합니다. 이는
URI 이스케이프 해제 및 디코딩을 수행하며, preserveEscapeSet 에 해당하는 Basic Latin 문자의 이스케이프 시퀀스는
보존합니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
R 을 빈 문자열로 둡니다.
k 를 0으로 둡니다.
k < len 인 동안 반복합니다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 둡니다.
S 를 C 로 둡니다.
C 가 코드 유닛 0x0025(PERCENT SIGN)이면,
k + 3 > len 이면 URIError
예외를 throw합니다.
escape 를 substring 로
string 의 k 부터 k + 3까지로 둡니다.
B 를 ParseHexOctet (string ,
k + 1)로 둡니다.
B 가 정수 가 아니면
URIError 예외를 throw합니다.
k 를 k + 2로 설정합니다.
n 을 B 의 선행 1 비트 개수로 둡니다.
n = 0이면,
asciiChar 를 값이 B 인 코드 유닛으로 둡니다.
preserveEscapeSet 에 asciiChar 가 포함되어 있으면
S 를 escape 로, 아니면 S 를
asciiChar 로 설정합니다.
그렇지 않으면,
n = 1 또는 n > 4이면
URIError 예외를 throw합니다.
Octets 를 « B »로 둡니다.
j 를 1로 둡니다.
j < n 인 동안 반복합니다,
k 를 k + 1로 설정합니다.
k + 3 > len 이면
URIError 예외를 throw합니다.
string 의 인덱스 k 에 있는 코드 유닛이
0x0025(PERCENT SIGN)가 아니면
URIError 예외를 throw합니다.
continuationByte 를 ParseHexOctet (string ,
k + 1)로 둡니다.
continuationByte 가 정수 가 아니면
URIError 예외를 throw합니다.
Octets 에 continuationByte 를
추가합니다.
k 를 k + 2로 설정합니다.
j 를 j + 1로 설정합니다.
Assert :
Octets 의 길이는 n 입니다.
Octets 가 유효한 UTF-8 인코딩의 유니코드 코드 포인트를 포함하지 않으면
URIError 예외를 throw합니다.
V 를 Octets 에 UTF-8 변환을 적용하여 얻은 코드 포인트로
둡니다. 즉, 옥텟 리스트를 21비트 값으로 변환합니다.
S 를 UTF16EncodeCodePoint (V )로
설정합니다.
R 을 문자열 연결 로 R 과
S 의 연결로 설정합니다.
k 를 k + 1로 설정합니다.
R 를 반환합니다.
참고
RFC 3629는 잘못된 UTF-8 옥텟 시퀀스의 디코딩을 금지합니다. 예를 들어, 잘못된 시퀀스 0xC0 0x80은 코드 유닛 0x0000으로
디코딩되어서는 안 됩니다. Decode 알고리즘의 구현체는 이러한 잘못된 시퀀스를 만날 때 반드시 URIError 를
throw해야 합니다.
19.2.6.7 ParseHexOctet ( string , position
)
추상 연산 ParseHexOctet은 string (문자열)과 position (0 이상의 정수 ) 인자를 받고, 0 이상의
정수 또는 비어 있지 않은
리스트 의
SyntaxError 객체들을 반환합니다. string 의 지정된 position 에서 두 개의
16진수 문자를 부호 없는 8비트 정수 로 파싱합니다. 호출 시 다음 단계를 수행합니다:
len 을 string 의 길이로 둡니다.
Assert :
position + 2 ≤ len .
hexDigits 를 substring 로 string 의
position 부터 position + 2까지로 둡니다.
parseResult 를 ParseText (hexDigits , HexDigits [~Sep] )로
둡니다.
parseResult 가 구문 노드 가 아니면
parseResult 를 반환합니다.
n 을 parseResult 의 MV로 둡니다.
Assert :
n 은 0에서 255까지의 포함 구간 내에 있습니다.
n 을 반환합니다.
19.3 글로벌 객체의 생성자 속성
19.3.1 AggregateError ( . . . )
20.5.7.1 를 참조하세요.
19.3.2 Array ( . . . )
23.1.1 를 참조하세요.
19.3.3 ArrayBuffer ( . . . )
25.1.4 를 참조하세요.
19.3.4 BigInt ( . . . )
21.2.1 를 참조하세요.
19.3.5 BigInt64Array ( . . . )
23.2.5 를 참조하세요.
19.3.6 BigUint64Array ( . . . )
23.2.5 를 참조하세요.
19.3.7 Boolean ( . . . )
20.3.1 를 참조하세요.
19.3.8 DataView ( . . . )
25.3.2 를 참조하세요.
19.3.9 Date ( . . . )
21.4.2 를 참조하세요.
19.3.10 Error ( . . . )
20.5.1 를 참조하세요.
19.3.11 EvalError ( . . . )
20.5.5.1 를
참조하세요.
19.3.12 FinalizationRegistry ( . . . )
26.2.1 를 참조하세요.
19.3.13 Float16Array ( . . . )
23.2.5 를 참조하세요.
19.3.14 Float32Array ( . . . )
23.2.5 를 참조하세요.
19.3.15 Float64Array ( . . . )
23.2.5 를 참조하세요.
19.3.16 Function ( . . . )
20.2.1 를 참조하세요.
19.3.17 Int8Array ( . . . )
23.2.5 를 참조하세요.
19.3.18 Int16Array ( . . . )
23.2.5 를 참조하세요.
19.3.19 Int32Array ( . . . )
23.2.5 를 참조하세요.
19.3.20 Iterator ( . . . )
27.1.3.1 를 참조하세요.
19.3.21 Map ( . . . )
24.1.1 를 참조하세요.
19.3.22 Number ( . . . )
21.1.1 를 참조하세요.
19.3.23 Object ( . . . )
20.1.1 를 참조하세요.
19.3.24 Promise ( . . . )
27.2.3 를 참조하세요.
19.3.25 Proxy ( . . . )
28.2.1 를 참조하세요.
19.3.26 RangeError ( . . . )
20.5.5.2 를
참조하세요.
19.3.27 ReferenceError ( . . . )
20.5.5.3 를
참조하세요.
19.3.28 RegExp ( . . . )
22.2.4 를 참조하세요.
19.3.29 Set ( . . . )
24.2.2 를 참조하세요.
19.3.30 SharedArrayBuffer ( . . . )
25.2.3 를 참조하세요.
19.3.31 String ( . . . )
22.1.1 를 참조하세요.
19.3.32 Symbol ( . . . )
20.4.1 를 참조하세요.
19.3.33 SyntaxError ( . . . )
20.5.5.4 를
참조하세요.
19.3.34 TypeError ( . . . )
20.5.5.5 를
참조하세요.
19.3.35 Uint8Array ( . . . )
23.2.5 를 참조하세요.
19.3.36 Uint8ClampedArray ( . . . )
23.2.5 를 참조하세요.
19.3.37 Uint16Array ( . . . )
23.2.5 를 참조하세요.
19.3.38 Uint32Array ( . . . )
23.2.5 를 참조하세요.
19.3.39 URIError ( . . . )
20.5.5.6 를
참조하세요.
19.3.40 WeakMap ( . . . )
24.3.1 를 참조하세요.
19.3.41 WeakRef ( . . . )
26.1.1 를 참조하세요.
19.3.42 WeakSet ( . . . )
24.4 를 참조하세요.
19.4 글로벌 객체의 기타 속성
19.4.1 Atomics
25.4 를 참조하세요.
19.4.2 JSON
25.5 를
참조하세요.
19.4.3 Math
21.3 를
참조하세요.
19.4.4 Reflect
28.1 를 참조하세요.
20 기본 객체
20.1 Object 객체
20.1.1 Object 생성자
Object 생성자 :
%Object% 입니다.
"Object" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 로 호출될
때 새로운 일반
객체 를 생성합니다.
생성자 대신
함수로 호출될 때 타입 변환을 수행합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다.
20.1.1.1 Object ( [ value ] )
이 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 도 활성 함수 객체 도 아니면,
? OrdinaryCreateFromConstructor (NewTarget,
"%Object.prototype%" )를 반환합니다.
value 가 undefined 또는 null 이면,
OrdinaryObjectCreate (%Object.prototype% )를
반환합니다.
! ToObject (value )를 반환합니다.
20.1.2 Object 생성자의 속성
Object 생성자 :
20.1.2.1 Object.assign ( target ,
...sources )
이 함수는 하나 이상의 소스 객체에서 모든 열거 가능한 자체 속성의 값을 target 객체로 복사합니다.
호출될 때 다음 단계를 수행합니다:
to 를 ? ToObject (target )로 둡니다.
인자가 하나만 전달되면 to 를 반환합니다.
sources 의 각 요소 nextSource 에 대해,
nextSource 가 undefined 도
null 도 아니면,
from 을 ! ToObject (nextSource )로
둡니다.
keys 를 ? from .[[OwnPropertyKeys]] () 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
desc 를 ? from .[[GetOwnProperty]] (nextKey )로
둡니다.
desc 가 undefined 가 아니고
desc .[[Enumerable]] 가
true 이면,
propValue 를 ? Get (from ,
nextKey )로 둡니다.
? Set (to ,
nextKey , propValue ,
true )를 수행합니다.
to 를 반환합니다.
이 함수의 "length" 속성 값은 2 𝔽 입니다.
20.1.2.2 Object.create ( O , Properties )
이 함수는 지정된 프로토타입을 가진 새 객체를 생성합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니고 O 가
null 이 아니면, TypeError 예외를 throw합니다.
obj 를 OrdinaryObjectCreate (O )로
둡니다.
Properties 가 undefined 가 아니면,
? ObjectDefineProperties (obj ,
Properties )를 반환합니다.
obj 를 반환합니다.
20.1.2.3 Object.defineProperties ( O ,
Properties )
이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , TypeError
예외를 throw합니다.
? ObjectDefineProperties (O ,
Properties )를 반환합니다.
20.1.2.3.1 ObjectDefineProperties ( O ,
Properties )
추상 연산 ObjectDefineProperties는 O (객체)와 Properties (ECMAScript 언어 값 ) 인자를 받고,
정상 완료 로 객체 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
props 를 ? ToObject (Properties )로
둡니다.
keys 를 ? props .[[OwnPropertyKeys]] () 로 둡니다.
descriptors 를 새로운 빈 리스트 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
propDesc 를 ? props .[[GetOwnProperty]] (nextKey )로
둡니다.
propDesc 가 undefined 가 아니고
propDesc .[[Enumerable]] 가
true 이면,
descObj 를 ? Get (props ,
nextKey )로 둡니다.
desc 를 ? ToPropertyDescriptor (descObj )로
둡니다.
Record
{ [[Key]] : nextKey , [[Descriptor]] : desc }
를 descriptors 에 추가합니다.
descriptors 의 각 요소 property 에 대해,
? DefinePropertyOrThrow (O ,
property .[[Key]] ,
property .[[Descriptor]] )를 수행합니다.
O 를 반환합니다.
20.1.2.4 Object.defineProperty ( O , P ,
Attributes )
이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.
호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , TypeError
예외를 throw합니다.
key 를 ? ToPropertyKey (P )로 둡니다.
desc 를 ? ToPropertyDescriptor (Attributes )로
둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
O 를 반환합니다.
20.1.2.5 Object.entries ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
entryList 를 ? EnumerableOwnProperties (obj ,
key+value )로 둡니다.
CreateArrayFromList (entryList )를
반환합니다.
20.1.2.6 Object.freeze ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? SetIntegrityLevel (O ,
frozen )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.7 Object.fromEntries ( iterable )
이 함수는 호출될 때 다음 단계를 수행합니다:
? RequireObjectCoercible (iterable )를
수행합니다.
obj 를 OrdinaryObjectCreate (%Object.prototype% )로
둡니다.
Assert :
obj 는 자신의 속성이 없는 확장 가능한 일반 객체 입니다.
closure 를 Abstract Closure
(매개변수 (key , value ), obj 캡처)로 두고, 호출 시 다음 단계를 수행합니다:
propertyKey 를 ? ToPropertyKey (key )로
둡니다.
! CreateDataPropertyOrThrow (obj ,
propertyKey , value )를 수행합니다.
NormalCompletion (undefined )를
반환합니다.
adder 를 CreateBuiltinFunction (closure ,
2, "" , « »)로 둡니다.
? AddEntriesFromIterable (obj ,
iterable , adder )를 반환합니다.
참고
adder 를 위해 생성된 함수는 ECMAScript 코드에서는 직접 접근할 수 없습니다.
20.1.2.8 Object.getOwnPropertyDescriptor ( O ,
P )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
desc 를 ? obj .[[GetOwnProperty]] (key )로 둡니다.
FromPropertyDescriptor (desc )를
반환합니다.
20.1.2.9 Object.getOwnPropertyDescriptors ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
ownKeys 를 ? obj .[[OwnPropertyKeys]] () 로 둡니다.
descriptors 를 OrdinaryObjectCreate (%Object.prototype% )로
둡니다.
ownKeys 의 각 요소 key 에 대해,
desc 를 ? obj .[[GetOwnProperty]] (key )로 둡니다.
descriptor 를 FromPropertyDescriptor (desc )로
둡니다.
descriptor 가 undefined 가 아니면,
! CreateDataPropertyOrThrow (descriptors ,
key , descriptor )를 수행합니다.
descriptors 를 반환합니다.
20.1.2.10 Object.getOwnPropertyNames ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
CreateArrayFromList (?
GetOwnPropertyKeys (O ,
string ))를 반환합니다.
20.1.2.11 Object.getOwnPropertySymbols ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
CreateArrayFromList (?
GetOwnPropertyKeys (O ,
symbol ))를 반환합니다.
20.1.2.11.1 GetOwnPropertyKeys ( O ,
type )
추상 연산 GetOwnPropertyKeys는 O (ECMAScript 언어
값 )
와 type (string 또는 symbol ) 인자를
받고, 정상 완료 로 리스트 의 속성 키 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
keys 를 ? obj .[[OwnPropertyKeys]] () 로 둡니다.
nameList 를 새로운 빈 리스트 로 둡니다.
keys 의 각 요소 nextKey 에 대해,
nextKey 가 Symbol 이고
type 이
symbol 이거나, nextKey 가 문자열 이고
type 이
string 이면,
nextKey 를 nameList 에 추가합니다.
nameList 를 반환합니다.
20.1.2.12 Object.getPrototypeOf ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
? obj .[[GetPrototypeOf]] () 를 반환합니다.
20.1.2.13 Object.groupBy ( items , callback
)
참고
callback 은 두 개의 인자를 받아야 하는 함수여야 합니다.
groupBy는 items 의 각 요소에 대해 오름차순으로 callback 을 한 번씩
호출해서 새 객체를 만듭니다. callback 이 반환한 각 값은 속성 키 로 강제 변환됩니다. 이렇게 변환된 각
속성
키 에 대해, 결과 객체는 해당 속성 키 를 가지고, 값은
callback 의 반환값이 그 키로 강제 변환된 모든 요소를 담은 배열입니다.
callback 은 두 인자(요소의 값, 요소의 인덱스)로 호출됩니다.
groupBy의 반환값은 %Object.prototype% 를
상속받지 않는 객체입니다.
이 함수는 호출될 때 다음 단계를 수행합니다:
groups 를 ? GroupBy (items ,
callback , property )로 둡니다.
obj 를 OrdinaryObjectCreate (null )로
둡니다.
groups 의 각 Record { [[Key]] , [[Elements]] }
g 에 대해,
elements 를 CreateArrayFromList (g .[[Elements]] )로 둡니다.
! CreateDataPropertyOrThrow (obj ,
g .[[Key]] , elements )를 수행합니다.
obj 를 반환합니다.
20.1.2.14 Object.hasOwn ( O , P )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? HasOwnProperty (obj ,
key )를 반환합니다.
20.1.2.15 Object.is ( value1 , value2 )
이 함수는 호출될 때 다음 단계를 수행합니다:
SameValue (value1 ,
value2 )를 반환합니다.
20.1.2.16 Object.isExtensible ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , false 를
반환합니다.
? IsExtensible (O )를 반환합니다.
20.1.2.17 Object.isFrozen ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , true 를
반환합니다.
? TestIntegrityLevel (O ,
frozen )를 반환합니다.
20.1.2.18 Object.isSealed ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , true 를
반환합니다.
? TestIntegrityLevel (O ,
sealed )를 반환합니다.
20.1.2.19 Object.keys ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
keyList 를 ? EnumerableOwnProperties (obj ,
key )로 둡니다.
CreateArrayFromList (keyList )를
반환합니다.
20.1.2.20 Object.preventExtensions ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? O .[[PreventExtensions]] () 로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.21 Object.prototype
Object.prototype의 초기값은 Object 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.1.2.22 Object.seal ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? SetIntegrityLevel (O ,
sealed )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.23 Object.setPrototypeOf ( O , proto
)
이 함수는 호출될 때 다음 단계를 수행합니다:
O 를 ? RequireObjectCoercible (O )로
설정합니다.
proto 가 객체가 아니고 proto 가
null 이 아니면, TypeError 예외를 throw합니다.
O 가 객체가 아니면 , O 를 반환합니다.
status 를 ? O .[[SetPrototypeOf]] (proto )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
O 를 반환합니다.
20.1.2.24 Object.values ( O )
이 함수는 호출될 때 다음 단계를 수행합니다:
obj 를 ? ToObject (O )로 둡니다.
valueList 를 ? EnumerableOwnProperties (obj ,
value )로 둡니다.
CreateArrayFromList (valueList )를
반환합니다.
20.1.3 Object 프로토타입 객체의 속성
Object 프로토타입 객체 :
%Object.prototype% 입니다.
[[Extensible]] 내부 슬롯의 값은 true 입니다.
일반
객체 에 대해 정의된 내부 메서드를 가집니다. 단, [[SetPrototypeOf]] 메서드는 10.4.7.1 에서
정의된 대로입니다.
(따라서, 불변 프로토타입 이국 객체 입니다.)
[[Prototype]] 내부 슬롯의 값은 null 입니다.
20.1.3.1 Object.prototype.constructor
Object.prototype.constructor의 초기값은 %Object% 입니다.
20.1.3.2 Object.prototype.hasOwnProperty ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
P 를 ? ToPropertyKey (V )로 둡니다.
O 를 ? ToObject (this 값)로
둡니다.
? HasOwnProperty (O ,
P )를 반환합니다.
참고
단계 1 와
2 의 순서는, 이전 명세에서
1 에서 던져졌던 예외가
this 값이 undefined 또는
null 일 때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.
20.1.3.3 Object.prototype.isPrototypeOf ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
V 가 객체가 아니면 ,
false 를 반환합니다.
O 를 ? ToObject (this 값)로
둡니다.
반복,
V 를 ? V .[[GetPrototypeOf]] () 로 설정합니다.
V 가 null 이면, false 를 반환합니다.
SameValue (O ,
V )가 true 이면, true 를 반환합니다.
참고
단계 1 와
2 의 순서는, V 가 객체가
아닌 경우와 this 값이 undefined 또는
null 일 때 이전 명세에서 지정된 동작을 유지합니다.
20.1.3.4 Object.prototype.propertyIsEnumerable ( V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
P 를 ? ToPropertyKey (V )로 둡니다.
O 를 ? ToObject (this 값)로
둡니다.
desc 를 ? O .[[GetOwnProperty]] (P )로 둡니다.
desc 가 undefined 면, false 를 반환합니다.
desc .[[Enumerable]] 를 반환합니다.
참고 1
이 메서드는 프로토타입 체인의 객체는 고려하지 않습니다.
참고 2
단계 1 와
2 의 순서는, 이전 명세에서
1 에서 던져졌던 예외가
this 값이 undefined 또는 null 일
때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.
20.1.3.5 Object.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
? Invoke (O ,
"toString" )을 반환합니다.
이 메서드의 선택적 매개변수는 사용되지 않지만 ECMA-402 toLocaleString 메서드에서 사용된 매개변수 패턴과 일치하도록
설계되었습니다. ECMA-402 지원이 없는 구현은 이 매개변수 위치를 다른 용도로 사용하면 안 됩니다.
참고 1
이 메서드는 로케일에 민감한 toString 동작이 없는 객체에 대해 일반적인 toLocaleString
구현을 제공합니다. Array, Number, Date 및 %TypedArray% 는 자체
로케일에 민감한 toLocaleString 메서드를 제공합니다.
참고 2
ECMA-402는 이 기본 구현의 대안을 의도적으로 제공하지 않습니다.
20.1.3.6 Object.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
this 값이 undefined 이면, "[object
Undefined]" 를 반환합니다.
this 값이 null 이면, "[object
Null]" 를 반환합니다.
O 를 ! ToObject (this 값)로
둡니다.
isArray 를 ? IsArray (O )로 둡니다.
isArray 가 true 이면, builtinTag 를
"Array" 로 둡니다.
그렇지 않고 O 에 [[ParameterMap]] 내부 슬롯이 있으면,
builtinTag 를 "Arguments" 로 둡니다.
그렇지 않고 O 에 [[Call]] 내부 메서드가 있으면,
builtinTag 를 "Function" 로 둡니다.
그렇지 않고 O 에 [[ErrorData]] 내부 슬롯이 있으면,
builtinTag 를 "Error" 로 둡니다.
그렇지 않고 O 에 [[BooleanData]] 내부 슬롯이 있으면,
builtinTag 를 "Boolean" 로 둡니다.
그렇지 않고 O 에 [[NumberData]] 내부 슬롯이 있으면,
builtinTag 를 "Number" 로 둡니다.
그렇지 않고 O 에 [[StringData]] 내부 슬롯이 있으면,
builtinTag 를 "String" 로 둡니다.
그렇지 않고 O 에 [[DateValue]] 내부 슬롯이 있으면,
builtinTag 를 "Date" 로 둡니다.
그렇지 않고 O 에 [[RegExpMatcher]] 내부 슬롯이 있으면,
builtinTag 를 "RegExp" 로 둡니다.
그 외에는, builtinTag 를 "Object" 로 둡니다.
tag 를 ? Get (O ,
%Symbol.toStringTag% )로 둡니다.
tag 가 문자열이
아니면 , tag 를 builtinTag 로 설정합니다.
문자열 연결 로 "[object
" , tag , "]" 을 반환합니다.
참고
과거에는 이 메서드를 통해 이전 명세에서 여러 내장 객체의 명목 타입 태그로 사용되던 [[Class]] 내부
슬롯의 문자열 값을 접근하기도 했습니다. 위의 toString 정의는 toString을 특정 내장 객체
종류의 테스트로 사용하는 레거시 코드의 호환성을 유지합니다. 그러나, 다른 종류의 내장 객체나 프로그램 정의 객체에 대해서는 신뢰할 수 있는 타입 판별
메커니즘을 제공하지 않습니다. 또한, 프로그램에서 %Symbol.toStringTag% 를 사용하면 이러한
레거시 타입 테스트의 신뢰성을 무효화할 수 있습니다.
20.1.3.7 Object.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ToObject (this 값)을
반환합니다.
20.1.3.8 Object.prototype.__proto__
Object.prototype.__proto__는 접근자 속성 이며, 특성은 { [[Enumerable]] : false , [[Configurable]] : true }입니다. [[Get]] 및 [[Set]] 특성은 다음과 같이 정의됩니다:
20.1.3.8.1 get Object.prototype.__proto__
[[Get]] 특성 값은 인자를 받지 않는 내장 함수입니다. 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
? O .[[GetPrototypeOf]] () 을 반환합니다.
20.1.3.8.2 set Object.prototype.__proto__
[[Set]] 특성 값은 proto 인자를 받는 내장 함수입니다. 호출될 때 다음 단계를
수행합니다:
O 를 ? RequireObjectCoercible (this
값)로 둡니다.
proto 가 객체가 아니고 , proto 가
null 이 아니면, undefined 를 반환합니다.
O 가 객체가 아니면 ,
undefined 를 반환합니다.
status 를 ? O .[[SetPrototypeOf]] (proto )로 둡니다.
status 가 false 이면, TypeError 예외를
throw합니다.
undefined 를 반환합니다.
20.1.3.9 레거시 Object.prototype 접근자 메서드
20.1.3.9.1 Object.prototype.__defineGetter__ ( P ,
getter )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
IsCallable (getter )가
false 면, TypeError 예외를 throw합니다.
desc 를 PropertyDescriptor { [[Get]] :
getter , [[Enumerable]] :
true , [[Configurable]] :
true }로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
undefined 를 반환합니다.
20.1.3.9.2 Object.prototype.__defineSetter__ ( P ,
setter )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
IsCallable (setter )가
false 면, TypeError 예외를 throw합니다.
desc 를 PropertyDescriptor { [[Set]] :
setter , [[Enumerable]] :
true , [[Configurable]] :
true }로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
? DefinePropertyOrThrow (O ,
key , desc )를 수행합니다.
undefined 를 반환합니다.
20.1.3.9.3 Object.prototype.__lookupGetter__ ( P
)
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
반복,
desc 를 ? O .[[GetOwnProperty]] (key )로
둡니다.
desc 가 undefined 가 아니면,
IsAccessorDescriptor (desc )
가 true 면 desc .[[Get]] 를 반환합니다.
undefined 를 반환합니다.
O 를 ? O .[[GetPrototypeOf]] () 로 설정합니다.
O 가 null 이면, undefined 를
반환합니다.
20.1.3.9.4 Object.prototype.__lookupSetter__ ( P
)
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this
값)로 둡니다.
key 를 ? ToPropertyKey (P )로 둡니다.
반복,
desc 를 ? O .[[GetOwnProperty]] (key )로
둡니다.
desc 가 undefined 가 아니면,
IsAccessorDescriptor (desc )
가 true 면 desc .[[Set]] 를 반환합니다.
undefined 를 반환합니다.
O 를 ? O .[[GetPrototypeOf]] () 로 설정합니다.
O 가 null 이면, undefined 를
반환합니다.
20.1.4 Object 인스턴스의 속성
객체 인스턴스는 Object 프로토타입 객체 로부터
상속받은 것 이외에는 특별한 속성이 없습니다.
20.2 Function 객체
20.2.1 Function 생성자
Function 생성자 :
%Function% 입니다.
"Function" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 대신
함수로 호출될 때 새로운 함수
객체 를 생성하고 초기화합니다. 따라서 Function(…) 함수 호출은 동일한 인자를 가진
new Function(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Function 동작을 상속하려는 서브클래스 생성자 는 내장 함수 동작에
필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Function 생성자 에 super 호출을 포함해야
합니다. 함수
객체 정의를 위한 모든 ECMAScript 구문은 Function의 인스턴스를 생성합니다. 내장
GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고 Function 서브클래스 인스턴스를
생성하는 구문은 없습니다.
20.2.1.1 Function ( ...parameterArgs ,
bodyArg )
마지막 인자(있다면)는 함수의 본문(실행 코드)을 지정합니다. 그 앞의 인자들은 형식 매개변수를 지정합니다.
이 함수는 호출될 때 다음 단계를 수행합니다:
C 를 활성 함수 객체 로 둡니다.
bodyArg 가 없으면 bodyArg 를 빈 문자열로 설정합니다.
? CreateDynamicFunction (C ,
NewTarget, normal , parameterArgs ,
bodyArg )를 반환합니다.
참고
각 형식 매개변수에 대해 인자를 하나씩 가지는 것은 허용되지만 필수는 아닙니다. 예를 들어, 아래 세 표현식은 모두 동일한 결과를 생성합니다:
new Function ("a" , "b" , "c" , "return a+b+c" )
new Function ("a, b, c" , "return a+b+c" )
new Function ("a,b" , "c" , "return a+b+c" )
20.2.1.1.1 CreateDynamicFunction ( constructor ,
newTarget , kind , parameterArgs , bodyArg )
추상 연산 CreateDynamicFunction은 constructor (생성자 ),
newTarget (생성자 또는 undefined ),
kind (normal , generator ,
async , async-generator ),
parameterArgs (리스트 의
ECMAScript 언어 값 ),
bodyArg (ECMAScript 언어 값 )을 인자로 받고,
정상 완료 로
ECMAScript 함수 객체 또는 throw 완료 를 반환합니다.
constructor 는 이 동작을 수행하는 생성자 함수입니다. newTarget 은 처음
new가 적용된 생성자 입니다. parameterArgs 와
bodyArg 는 constructor 에 전달된 인자 값을 반영합니다. 호출 시 다음 단계를 수행합니다:
newTarget 이 undefined 이면, newTarget 를
constructor 로 설정합니다.
kind 가 normal 이면,
prefix 를 "function" 로 둡니다.
exprSym 를 FunctionExpression 로
둡니다.
bodySym 를 FunctionBody [~Yield,
~Await] 로 둡니다.
parameterSym 를 FormalParameters [~Yield,
~Await] 로 둡니다.
fallbackProto 를
"%Function.prototype%" 로 둡니다.
그렇지 않고 kind 가 generator 이면,
prefix 를 "function*" 로 둡니다.
exprSym 를 GeneratorExpression 로
둡니다.
bodySym 를 GeneratorBody 로 둡니다.
parameterSym 를 FormalParameters [+Yield,
~Await] 로 둡니다.
fallbackProto 를
"%GeneratorFunction.prototype%" 로 둡니다.
그렇지 않고 kind 가 async 이면,
prefix 를 "async function" 로 둡니다.
exprSym 를 AsyncFunctionExpression 로
둡니다.
bodySym 를 AsyncFunctionBody 로
둡니다.
parameterSym 를 FormalParameters [~Yield,
+Await] 로 둡니다.
fallbackProto 를
"%AsyncFunction.prototype%" 로 둡니다.
그 외,
Assert : kind 는
async-generator 입니다.
prefix 를 "async function*" 로 둡니다.
exprSym 를 AsyncGeneratorExpression 로
둡니다.
bodySym 를 AsyncGeneratorBody 로
둡니다.
parameterSym 를 FormalParameters [+Yield,
+Await] 로 둡니다.
fallbackProto 를
"%AsyncGeneratorFunction.prototype%" 로 둡니다.
argCount 를 parameterArgs 의 요소 개수로 둡니다.
parameterStrings 를 새로운 빈 리스트 로 둡니다.
parameterArgs 의 각 요소 arg 에 대해,
? ToString (arg )를
parameterStrings 에 추가합니다.
bodyString 을 ? ToString (bodyArg )로 둡니다.
currentRealm 을 현재 Realm Record 로 둡니다.
? HostEnsureCanCompileStrings (currentRealm ,
parameterStrings , bodyString , false )를
수행합니다.
P 를 빈 문자열로 둡니다.
argCount > 0이면,
P 를 parameterStrings [0]로 설정합니다.
k 를 1로 둡니다.
k < argCount 인 동안 반복,
nextArgString 를
parameterStrings [k ]로 둡니다.
P 를 문자열
연결 로 P ,
"," (쉼표), nextArgString 의 연결로 설정합니다.
k 를 k + 1로 설정합니다.
bodyParseString 를 문자열 연결 로
0x000A(LINE FEED), bodyString , 0x000A(LINE FEED)의 연결로 둡니다.
sourceString 를 문자열 연결 로
prefix , " anonymous(" , P , 0x000A(LINE
FEED), ") {" , bodyParseString ,
"}" 의 연결로 둡니다.
sourceText 를 StringToCodePoints (sourceString )로
둡니다.
parameters 를 ParseText (P ,
parameterSym )로 둡니다.
parameters 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
body 를 ParseText (bodyParseString ,
bodySym )로 둡니다.
body 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
참고: 매개변수와 본문은 각각 단독으로 유효한지 확인하기 위해 따로 파싱됩니다. 예를 들어,
new Function("/*", "*/ ) {")는 함수로 평가되지 않습니다.
참고: 이 단계에 도달했다면 sourceText 는 exprSym 의 문법을 가져야 합니다(역은 성립하지
않음). 다음 두 단계의 목적은 exprSym 에 직접 적용되는 Early Error 규칙을 강제하는 것입니다.
expr 를 ParseText (sourceText ,
exprSym )로 둡니다.
expr 가 리스트 의 오류라면,
SyntaxError 예외를 throw합니다.
proto 를 ? GetPrototypeFromConstructor (newTarget ,
fallbackProto )로 둡니다.
env 를 currentRealm .[[GlobalEnv]] 로
둡니다.
privateEnv 를 null 로 둡니다.
F 를 OrdinaryFunctionCreate (proto ,
sourceText , parameters , body ,
non-lexical-this , env , privateEnv )로
둡니다.
SetFunctionName (F ,
"anonymous" )를 수행합니다.
kind 가 generator 이면,
prototype 를 OrdinaryObjectCreate (%GeneratorPrototype% )로
둡니다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] :
false })를 수행합니다.
그렇지 않고 kind 가 async-generator 이면,
prototype 를 OrdinaryObjectCreate (%AsyncGeneratorPrototype% )로
둡니다.
! DefinePropertyOrThrow (F ,
"prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] :
false })를 수행합니다.
그렇지 않고 kind 가 normal 이면,
MakeConstructor (F )를
수행합니다.
참고: kind 가 async 인 함수는 생성 불가능하며 [[Construct]] 내부 메서드나 "prototype" 속성을
갖지 않습니다.
F 를 반환합니다.
참고
CreateDynamicFunction은 kind 가 async 가 아닌 함수에 대해
"prototype" 속성을 정의하여 해당 함수가 생성자 로 사용될 수 있도록 합니다.
20.2.2 Function 생성자의 속성
Function 생성자 :
20.2.2.1 Function.prototype
Function.prototype의 값은 Function 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.2.3 Function 프로토타입 객체의 속성
Function 프로토타입 객체 :
%Function.prototype% 입니다.
자체적으로 내장 함수
객체 입니다.
어떤 인자도 받아들이며, 호출 시 undefined 를 반환합니다.
[[Construct]] 내부 메서드가 없으므로 new 연산자와 함께 생성자 로 사용할 수
없습니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
"prototype" 속성을 가지지 않습니다.
"length" 속성의 값은
+0 𝔽 입니다.
"name" 속성의 값은 빈 문자열입니다.
참고
Function 프로토타입 객체는 ECMAScript 2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위해 함수
객체 로 지정되어 있습니다.
20.2.3.1 Function.prototype.apply ( thisArg ,
argArray )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
IsCallable (func )가
false 이면, TypeError 예외를 throw합니다.
argArray 가 undefined 또는
null 이면,
PrepareForTailCall ()를
수행합니다.
? Call (func ,
thisArg )를 반환합니다.
argList 를 ? CreateListFromArrayLike (argArray )로
둡니다.
PrepareForTailCall ()를 수행합니다.
? Call (func ,
thisArg ,
argList )를 반환합니다.
참고 1
thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로,
Edition 3에서는 undefined 또는 null
thisArg 가 글로벌 객체 로 대체되고, 다른 값에는 ToObject 가
적용된 결과가 this 값으로 전달되었습니다. thisArg 가 수정 없이 전달되더라도,
strict하지 않은 함수 는 함수 진입 시 여전히 이러한
변환을 수행합니다.
참고 2
func 가 화살표 함수이거나 bound function exotic
object 라면, thisArg 는 6단계 6 의 [[Call]] 에서 무시됩니다.
20.2.3.2 Function.prototype.bind ( thisArg ,
...args )
이 메서드는 호출될 때 다음 단계를 수행합니다:
Target 를 this 값으로 둡니다.
IsCallable (Target )가
false 이면, TypeError 예외를 throw합니다.
F 를 ? BoundFunctionCreate (Target ,
thisArg , args )로 둡니다.
L 을 0으로 둡니다.
targetHasLength 를 ? HasOwnProperty (Target ,
"length" )로 둡니다.
targetHasLength 가 true 이면,
targetLen 를 ? Get (Target ,
"length" )로 둡니다.
targetLen 가 Number 이면,
targetLen 가 +∞ 𝔽 이면,
L 을 +∞로 설정합니다.
그렇지 않고 targetLen 가 -∞ 𝔽 이면,
L 을 0으로 설정합니다.
그 외에는,
targetLenAsInt 를 ! ToIntegerOrInfinity (targetLen )로
둡니다.
Assert :
targetLenAsInt 가 유한 입니다.
argCount 를 args 의 요소 개수로 둡니다.
L 을 max (targetLenAsInt
- argCount , 0)로 설정합니다.
SetFunctionLength (F ,
L )을 수행합니다.
targetName 를 ? Get (Target ,
"name" )로 둡니다.
targetName 가 문자열이
아니면 , targetName 을 빈 문자열로 설정합니다.
SetFunctionName (F ,
targetName , "bound" )을 수행합니다.
F 를 반환합니다.
참고 1
Function.prototype.bind를 사용해 생성된 함수 객체 는 이국
객체 입니다. 또한 "prototype" 속성을 가지지 않습니다.
참고 2
Target 이 화살표 함수이거나 bound function exotic
object 이면, 이 메서드에 전달된 thisArg 는 이후 F 를 호출할
때 사용되지 않습니다.
20.2.3.3 Function.prototype.call ( thisArg ,
...args )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
IsCallable (func )가
false 이면, TypeError 예외를 throw합니다.
PrepareForTailCall ()를 수행합니다.
? Call (func ,
thisArg ,
args )를 반환합니다.
참고 1
thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로,
Edition 3에서는 undefined 또는 null
thisArg 가 글로벌 객체 로 대체되고, 다른 값에는 ToObject 가
적용된 결과가 this 값으로 전달되었습니다. thisArg 가 수정 없이 전달되더라도,
strict하지 않은 함수 는 함수 진입 시 여전히 이러한
변환을 수행합니다.
참고 2
func 가 화살표 함수이거나 bound function exotic
object 라면, thisArg 는 4단계 4 의 [[Call]] 에서 무시됩니다.
20.2.3.4 Function.prototype.constructor
Function.prototype.constructor의 초기값은 %Function% 입니다.
20.2.3.5 Function.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
func 를 this 값으로 둡니다.
func 가 객체 이고, func 에 [[SourceText]] 내부 슬롯이 있고, func .[[SourceText]] 가 유니코드 코드 포인트 시퀀스이고, HostHasSourceTextAvailable (func )
가 true 이면,
CodePointsToString (func .[[SourceText]] )를 반환합니다.
func 가 내장 함수 객체 이면,
func 의 구현 정의 문자열 소스코드 표현을 반환합니다. 표현은
NativeFunction
문법을 가져야 합니다. 또한, func 에 [[InitialName]] 내부 슬롯이
있고, func .[[InitialName]] 이 문자열 이면, 반환
문자열에서 NativeFunctionAccessor opt
PropertyName 에 해당하는
부분은 func .[[InitialName]] 이어야 합니다.
func 가 객체 이고, IsCallable (func )가
true 이면, func 의 구현 정의 문자열 소스코드
표현을 반환합니다. 표현은 NativeFunction 문법을 가져야 합니다.
TypeError 예외를 throw합니다.
NativeFunction :
function
NativeFunctionAccessor opt
PropertyName [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
[
native
code
]
}
NativeFunctionAccessor
:
get
set
20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] (
V )
이 메서드는 호출될 때 다음 단계를 수행합니다:
F 를 this 값으로 둡니다.
? OrdinaryHasInstance (F ,
V )를 반환합니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
이것은 대부분의 함수가 상속받는 %Symbol.hasInstance%의 기본 구현입니다.
%Symbol.hasInstance%는 instanceof 연산자가 특정 생성자 의
인스턴스인지 판별하기 위해 호출됩니다. 예를 들면
v instanceof F
는 다음과 같이 평가됩니다:
F[%Symbol .hasInstance %](v)
생성자 함수는 함수에 다른
%Symbol.hasInstance% 메서드를 노출하여 어떤 객체가 instanceof로 자신의 인스턴스로 인식되는지 제어할 수
있습니다.
이 속성은 전역적으로 bound 함수의 타겟 함수를 노출할 수 있는 변조를 방지하기 위해 쓰기 불가능 및 설정 불가능입니다.
이 메서드의 "name" 속성 값은 "[Symbol.hasInstance]" 입니다.
20.2.4 Function 인스턴스
모든 Function 인스턴스는 ECMAScript 함수 객체 이며, 표 30 에 나열된 내부
슬롯을 가집니다.
Function
객체 는 Function.prototype.bind 메서드(20.2.3.2 )를 사용해 생성된 경우 표 31 에 나열된
내부 슬롯을 가집니다.
함수 인스턴스는 다음과 같은 속성을 가집니다:
20.2.4.1 length
"length" 속성의 값은 함수에서 일반적으로 기대되는 인자 수를 나타내는 정수
Number 입니다. 그러나 언어는 함수가 다른 개수의 인자로 호출되는 것을 허용합니다. 함수가
"length" 속성에 지정된 개수와 다른 인자 수로 호출될 때의 동작은 함수에 따라 다릅니다. 이 속성의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }입니다.
20.2.4.2 name
"name" 속성의 값은 함수의 설명을 나타내는 문자열 입니다. 이름은 의미적
중요성을 가지지 않지만, 일반적으로 프로퍼티 이름 또는 함수가 ECMAScript 소스
텍스트 에서 정의된 위치에서 참조되는 변수명입니다. 이 속성의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }입니다.
이 명세에 의해 컨텍스트 이름이 연관되지 않은 익명 함수 객체는 "name" 속성의 값으로 빈 문자열을 사용합니다.
20.2.4.3 prototype
생성자 로 사용할 수
있는 함수 인스턴스는 "prototype" 속성을 가집니다. 이러한 Function 인스턴스가 생성될 때마다, 또 다른
일반
객체 가 생성되어 함수의 "prototype" 속성의 초기값이 됩니다. 별도의 지정이 없는
한, "prototype" 속성 값은 해당 함수가 생성자 로 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.
이 속성의 특성은 { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
Function.prototype.bind로 생성된 함수 객체 나, MethodDefinition (단, GeneratorMethod 또는
AsyncGeneratorMethod 가 아닌 경우)
또는 ArrowFunction 을
평가하여 생성된 함수 객체는 "prototype" 속성을 가지지 않습니다.
20.2.5 HostHasSourceTextAvailable ( func )
호스트 정의 추상 연산
HostHasSourceTextAvailable은 func (함수 객체 ) 인자를 받아 불리언 값을 반환합니다. 이는 호스트 환경 이
func 에 대해 소스 텍스트 제공을 막을 수 있도록 합니다.
HostHasSourceTextAvailable의 구현은 다음 요구 사항을 충족해야 합니다:
매개변수에 대해 결정적이어야 합니다. 특정 func 인자로 호출될 때마다 항상 동일한 결과를 반환해야 합니다.
HostHasSourceTextAvailable의 기본 구현은 true 를 반환합니다.
20.3 Boolean 객체
20.3.1 Boolean 생성자
Boolean 생성자 :
%Boolean% 입니다.
"Boolean" 속성의 초기값이며, 글로벌 객체 의 값입니다.
생성자 로 호출될
때 새로운 Boolean 객체를 생성 및 초기화합니다.
생성자 대신
함수로 호출될 때 타입 변환을 수행합니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Boolean 동작을 상속하려는 서브클래스 생성자 는 [[BooleanData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Boolean
생성자 에
super 호출을 포함해야 합니다.
20.3.1.1 Boolean ( value )
이 함수는 호출될 때 다음 단계를 수행합니다:
b 를 ToBoolean (value )로 둡니다.
NewTarget이 undefined 이면, b 를 반환합니다.
O 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%Boolean.prototype%" , « [[BooleanData]] »)로 둡니다.
O .[[BooleanData]] 에 b 를 설정합니다.
O 를 반환합니다.
20.3.2 Boolean 생성자의 속성
Boolean 생성자 :
20.3.2.1 Boolean.prototype
Boolean.prototype의 초기값은 Boolean 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.3.3 Boolean 프로토타입 객체의 속성
Boolean 프로토타입 객체 :
%Boolean.prototype% 입니다.
일반
객체 입니다.
자체적으로 Boolean 객체이며, [[BooleanData]] 내부 슬롯의 값은
false 입니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
20.3.3.1 Boolean.prototype.constructor
Boolean.prototype.constructor의 초기값은 %Boolean% 입니다.
20.3.3.2 Boolean.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
b 를 ? ThisBooleanValue (this
값)로 둡니다.
b 가 true 면 "true" 를 반환하고, 아니면
"false" 를 반환합니다.
20.3.3.3 Boolean.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ThisBooleanValue (this
값)을 반환합니다.
20.3.3.3.1 ThisBooleanValue ( value )
추상 연산 ThisBooleanValue는 value (ECMAScript 언어
값 ) 인자를 받아 정상 완료 로 Boolean
또는 throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
value 가 Boolean 이면,
value 를 반환합니다.
value 가 객체 이고 value
에 [[BooleanData]] 내부 슬롯이 있으면,
b 를 value .[[BooleanData]] 로
둡니다.
Assert : b 가 Boolean 임을
보장합니다.
b 를 반환합니다.
TypeError 예외를 throw합니다.
20.3.4 Boolean 인스턴스의 속성
Boolean 인스턴스는 일반
객체 이며, Boolean 프로토타입
객체 로부터 속성을 상속받습니다. Boolean 인스턴스는 [[BooleanData]]
내부 슬롯을 가집니다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 표현하는 Boolean 값입니다.
20.4 Symbol 객체
20.4.1 Symbol 생성자
Symbol 생성자 :
%Symbol% 입니다.
"Symbol" 속성의 초기값이며, 글로벌 객체 의 값입니다.
함수로 호출될 때 새로운 Symbol 값을 반환합니다.
new 연산자와 함께 사용하는 것은 의도되지 않았습니다.
서브클래싱을 목적으로 하지 않습니다.
클래스 정의의 extends 절의 값으로 사용할 수 있지만, super 호출 시 예외가 발생합니다.
20.4.1.1 Symbol ( [ description ] )
이 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 가 아니면, TypeError 예외를
throw합니다.
description 이 undefined 면, descString 을
undefined 로 둡니다.
그 외에는, descString 을 ? ToString (description )로 둡니다.
[[Description]] 이 descString 인 새로운 Symbol을 반환합니다.
20.4.2 Symbol 생성자의 속성
Symbol 생성자 :
20.4.2.1 Symbol.asyncIterator
Symbol.asyncIterator의 초기값은 well-known symbol %Symbol.asyncIterator% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.2 Symbol.for ( key )
이 함수는 호출될 때 다음 단계를 수행합니다:
stringKey 를 ? ToString (key )로 둡니다.
GlobalSymbolRegistry
List 의 각 요소 e 에 대해,
e .[[Key]] 가 stringKey 와 같으면,
e .[[Symbol]] 을 반환합니다.
Assert :
GlobalSymbolRegistry List 에 현재
stringKey 에 대한 항목이 없습니다.
newSymbol 을 [[Description]] 이
stringKey 인 새로운 Symbol로 둡니다.
GlobalSymbolRegistry에 Record { [[Key]] : stringKey , [[Symbol]] : newSymbol }를 추가합니다.
newSymbol 을 반환합니다.
GlobalSymbolRegistry List 는 전역적으로 사용 가능한 append-only 리스트 입니다. 모든 realm 에서 공유됩니다. ECMAScript
코드가 평가되기 전에 새로운 빈 리스트 로 초기화됩니다.
GlobalSymbolRegistry List의 요소는 Record 이며, 표
63 에 정의된 구조를 가집니다.
표 63: GlobalSymbolRegistry Record 필드
필드 이름
값
용도
[[Key]]
문자열
Symbol을 전역적으로 식별하는 데 사용되는 문자열 키.
[[Symbol]]
Symbol
어떤 realm 에서도 검색할 수 있는 symbol.
20.4.2.3 Symbol.hasInstance
Symbol.hasInstance의 초기값은 well-known symbol %Symbol.hasInstance% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.4 Symbol.isConcatSpreadable
Symbol.isConcatSpreadable의 초기값은 well-known symbol
%Symbol.isConcatSpreadable% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.5 Symbol.iterator
Symbol.iterator의 초기값은 well-known symbol %Symbol.iterator%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.6 Symbol.keyFor ( sym )
이 함수는 호출될 때 다음 단계를 수행합니다:
sym 이 Symbol이
아니면 , TypeError 예외를 throw합니다.
KeyForSymbol (sym )을 반환합니다.
20.4.2.7 Symbol.match
Symbol.match의 초기값은 well-known symbol %Symbol.match%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.8 Symbol.matchAll
Symbol.matchAll의 초기값은 well-known symbol %Symbol.matchAll%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.9 Symbol.prototype
Symbol.prototype의 초기값은 Symbol 프로토타입
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.10 Symbol.replace
Symbol.replace의 초기값은 well-known symbol %Symbol.replace%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.11 Symbol.search
Symbol.search의 초기값은 well-known symbol %Symbol.search%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.12 Symbol.species
Symbol.species의 초기값은 well-known symbol %Symbol.species%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.13 Symbol.split
Symbol.split의 초기값은 well-known symbol %Symbol.split%
(표 1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.14 Symbol.toPrimitive
Symbol.toPrimitive의 초기값은 well-known symbol %Symbol.toPrimitive% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.15 Symbol.toStringTag
Symbol.toStringTag의 초기값은 well-known symbol %Symbol.toStringTag% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.2.16 Symbol.unscopables
Symbol.unscopables의 초기값은 well-known symbol %Symbol.unscopables% (표
1 )입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.4.3 Symbol 프로토타입 객체의 속성
Symbol 프로토타입 객체 :
20.4.3.1 Symbol.prototype.constructor
Symbol.prototype.constructor의 초기값은 %Symbol% 입니다.
20.4.3.2 get Symbol.prototype.description
Symbol.prototype.description은 접근자 속성 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출될 때 다음 단계를 수행합니다:
s 를 this 값으로 둡니다.
sym 을 ? ThisSymbolValue (s )로
둡니다.
sym .[[Description]] 을 반환합니다.
20.4.3.3 Symbol.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
sym 을 ? ThisSymbolValue (this
값)으로 둡니다.
SymbolDescriptiveString (sym )을
반환합니다.
20.4.3.3.1 SymbolDescriptiveString ( sym )
추상 연산 SymbolDescriptiveString은 sym (Symbol)을 인자로 받아 문자열을 반환합니다. 호출 시 다음 단계를
수행합니다:
desc 를 sym .[[Description]] 로 설정합니다.
만약 desc 이 undefined 라면, desc 를 빈 문자열로
설정합니다.
단언 :
desc
문자열 입니다.
"Symbol(" , desc , 그리고 ")" 의
문자열 연결 을 반환합니다.
20.4.3.4 Symbol.prototype.valueOf ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
? ThisSymbolValue (this
값)을 반환합니다.
20.4.3.4.1 ThisSymbolValue ( value )
추상 연산 ThisSymbolValue는 value (ECMAScript 언어
값 ) 인자를 받아 정상 완료 로 Symbol 또는
throw 완료 를 반환합니다.
호출 시 다음 단계를 수행합니다:
value 가 Symbol 이면,
value 를 반환합니다.
value 가 객체 이고 value
에 [[SymbolData]] 내부 슬롯이 있으면,
s 를 value .[[SymbolData]] 로
둡니다.
Assert : s 가 Symbol 임을
보장합니다.
s 를 반환합니다.
TypeError 예외를 throw합니다.
20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] (
hint )
이 메서드는 ECMAScript 언어 연산자가 Symbol 객체를 프리미티브 값으로 변환하기 위해 호출합니다.
호출될 때 다음 단계를 수행합니다:
? ThisSymbolValue (this
값)을 반환합니다.
참고
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
이 메서드의 "name" 속성 값은 "[Symbol.toPrimitive]" 입니다.
20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열 값
"Symbol" 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
20.4.4 Symbol 인스턴스의 속성
Symbol 인스턴스는 일반
객체 이며, Symbol 프로토타입
객체 로부터 속성을 상속받습니다. Symbol 인스턴스는 [[SymbolData]] 내부
슬롯을 가집니다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 표현하는 Symbol 값입니다.
20.4.5 Symbol을 위한 추상 연산
20.4.5.1 KeyForSymbol ( sym )
추상 연산 KeyForSymbol은 sym (Symbol)을 인자로 받아 문자열 또는 undefined 를
반환합니다. sym 이 GlobalSymbolRegistry 리스트 에 있으면, sym 을
등록할 때 사용한 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:
GlobalSymbolRegistry 리스트 의 각 요소
e 에 대해,
SameValue (e .[[Symbol]] , sym )이
true 이면, e .[[Key]] 를
반환합니다.
Assert :
GlobalSymbolRegistry 리스트 는 현재
sym 에 대한 엔트리를 포함하지 않습니다.
undefined 를 반환합니다.
20.5 Error 객체
오류 객체의 인스턴스는 런타임 오류가 발생할 때 예외로 throw됩니다. 오류 객체는 사용자 정의 예외 클래스의 기본 객체로도 사용될 수 있습니다.
ECMAScript 구현에서 런타임 오류를 감지하면 20.5.5 에서
정의된 NativeError 객체 중 하나의 새 인스턴스 또는 20.5.7 에서 정의된 AggregateError
객체의 새 인스턴스를 throw합니다.
20.5.1 Error 생성자
Error 생성자 :
%Error% 입니다.
전역
객체 의 "Error" 프로퍼티의 초기 값입니다.
생성자가 아닌 함수로 호출될 때 새로운 Error 객체를 생성 및 초기화합니다. 따라서 Error(…) 함수 호출은 동일한 인자로
new Error(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Error 동작을 상속하려는 서브클래스 생성자 는 [[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 Error 생성자 에
super 호출을 포함해야 합니다.
20.5.1.1 Error ( message [ , options ] )
이 함수가 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%Error.prototype%" , « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
O 를 반환합니다.
20.5.2 Error 생성자의 프로퍼티
Error 생성자 :
20.5.2.1 Error.isError ( arg )
이 함수가 호출될 때 다음 단계를 수행합니다:
arg 가 객체가 아니면 false 를
반환합니다.
arg 에 [[ErrorData]] 내부 슬롯이 없으면
false 를 반환합니다.
true 를 반환합니다.
20.5.2.2 Error.prototype
Error.prototype의 초기 값은 Error 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
20.5.3 Error 프로토타입 객체의 프로퍼티
Error 프로토타입 객체 :
%Error.prototype% 입니다.
일반
객체 입니다.
Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않습니다.
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
20.5.3.1 Error.prototype.constructor
Error.prototype.constructor의 초기 값은 %Error% 입니다.
20.5.3.2 Error.prototype.message
Error.prototype.message의 초기 값은 빈 문자열입니다.
20.5.3.3 Error.prototype.name
Error.prototype.name의 초기 값은 "Error" 입니다.
20.5.3.4 Error.prototype.toString ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 설정합니다.
O 가 객체가 아니면 TypeError
예외를 throw합니다.
name 을 ? Get (O ,
"name" )으로 설정합니다.
name 이 undefined 이면 name 을
"Error" 로, 아니면 ? ToString (name )으로 설정합니다.
msg 를 ? Get (O ,
"message" )로 설정합니다.
msg 가 undefined 이면 msg 를 빈 문자열로, 아니면
? ToString (msg )로 설정합니다.
name 이 빈 문자열이면 msg 를 반환합니다.
msg 가 빈 문자열이면 name 을 반환합니다.
name 과 코드 유닛 0x003A (COLON), 코드 유닛 0x0020 (SPACE), 그리고 msg 를
문자열 연결 해서 반환합니다.
20.5.4 Error 인스턴스의 프로퍼티
오류 인스턴스는 일반
객체 로, Error 프로토타입
객체 로부터 프로퍼티를 상속하고, [[ErrorData]] 내부 슬롯의 값은
undefined 입니다. [[ErrorData]] 의 유일하게 명시된 사용은
Object.prototype.toString 및 Error.isError에서 Error, AggregateError, 그리고
NativeError 인스턴스를 Error 객체로 식별하는 것입니다.
20.5.5 이 표준에서 사용되는 네이티브 오류 타입
런타임 오류가 감지되면 아래의 NativeError 객체 또는 AggregateError 객체의 새 인스턴스가 throw됩니다. 모든
NativeError 객체는 20.5.6 에서 설명된 동일한 구조를 공유합니다.
20.5.5.1 EvalError
EvalError 생성자 는 %EvalError% 입니다.
이 예외는 현재 명세에서 사용되지 않습니다. 이 객체는 이전 버전과의 호환성을 위해 남아 있습니다.
20.5.5.2 RangeError
RangeError 생성자 는 %RangeError% 입니다.
허용되는 값의 집합 또는 범위에 속하지 않는 값을 나타냅니다.
20.5.5.3 ReferenceError
ReferenceError 생성자 는 %ReferenceError% 입니다.
잘못된 참조가 감지되었음을 나타냅니다.
20.5.5.4 SyntaxError
SyntaxError 생성자 는 %SyntaxError% 입니다.
파싱 오류가 발생했음을 나타냅니다.
20.5.5.5 TypeError
TypeError 생성자 는 %TypeError% 입니다.
다른 NativeError 객체가 실패 원인을 적절하게 나타내지 않을 때, TypeError는 실패 원인을 나타내기 위해 사용됩니다.
20.5.5.6 URIError
URIError 생성자 는 %URIError% 입니다.
전역 URI 처리 함수 중 하나가 그 정의와 호환되지 않는 방식으로 사용됐음을 나타냅니다.
20.5.6 NativeError 객체 구조
이 객체들은 아래에 설명된 구조를 가지며, 생성자 이름과 프로토타입 객체의 "name" 프로퍼티에서만 이름이 다릅니다.
각 오류 객체에 대해 정의에서 NativeError 에 대한 참조는 20.5.5 의 해당 오류 객체
이름으로 대체되어야 합니다.
20.5.6.1 NativeError 생성자
각 NativeError 생성자 :
생성자가 아닌 함수로 호출될 때 새로운 NativeError 객체를 생성 및 초기화합니다. 객체를 함수로 호출하는 것은 동일한 인자로
생성자 로
호출하는 것과 동일합니다. 따라서 NativeError (…) 함수 호출은 동일한 인자로
new NativeError (…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 NativeError 동작을 상속하려는
서브클래스 생성자 는 [[ErrorData]]
내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 NativeError 생성자 에 super 호출을
포함해야 합니다.
20.5.6.1.1 NativeError ( message [ ,
options ] )
각 NativeError 함수는 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를
? OrdinaryCreateFromConstructor (newTarget ,
"%NativeError .prototype%", « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
O 를 반환합니다.
2 단계에 전달되는
문자열의 실제 값은 "%EvalError.prototype%" ,
"%RangeError.prototype%" ,
"%ReferenceError.prototype%" ,
"%SyntaxError.prototype%" ,
"%TypeError.prototype%" , 또는 "%URIError.prototype%"
중 하나로, 정의되는 NativeError 생성자 에 해당합니다.
20.5.6.2 NativeError 생성자의 프로퍼티
각 NativeError 생성자 :
[[Prototype]] 내부 슬롯의 값은 %Error% 입니다.
"name" 프로퍼티 값은 문자열 값 "NativeError " 입니다.
다음 프로퍼티를 가집니다:
20.5.6.2.1 NativeError .prototype
NativeError .prototype의 초기 값은 NativeError 프로토타입 객체
(20.5.6.3 )입니다.
각 NativeError 생성자 는 고유한 프로토타입 객체를 가집니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }입니다.
20.5.6.3 NativeError 프로토타입 객체의 프로퍼티
각 NativeError 프로토타입 객체 :
20.5.6.3.1 NativeError .prototype.constructor
특정 NativeError 생성자 의 프로토타입의 "constructor"
프로퍼티의 초기 값은 생성자 자체입니다.
20.5.6.3.2 NativeError .prototype.message
특정 NativeError 생성자 의 프로토타입의 "message"
프로퍼티의 초기 값은 빈 문자열입니다.
20.5.6.3.3 NativeError .prototype.name
특정 NativeError 생성자 의 프로토타입의 "name" 프로퍼티의
초기 값은 생성자 의 이름(정의 시 NativeError 대신 사용된
이름)입니다.
20.5.6.4 NativeError 인스턴스의 프로퍼티
NativeError 인스턴스는 일반 객체 로, 고유한 NativeError 프로토타입
객체로부터 프로퍼티를 상속하고 [[ErrorData]] 내부 슬롯의 값은
undefined 입니다. [[ErrorData]] 의 유일하게 명시된 사용은
Object.prototype.toString
(20.1.3.6 ) 및
Error.isError (20.5.2.1 )에서 Error,
AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.
20.5.7 AggregateError 객체
20.5.7.1 AggregateError 생성자
AggregateError 생성자 :
%AggregateError% 입니다.
전역
객체 의 "AggregateError" 프로퍼티의 초기 값입니다.
생성자가 아닌 함수로 호출될 때 새로운 AggregateError 객체를 생성 및 초기화합니다. 따라서 AggregateError(…)
함수 호출은 동일한 인자로 new AggregateError(…) 객체 생성 표현식과 동일합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 AggregateError 동작을 상속하려는 서브클래스
생성자 는
[[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해
AggregateError 생성자 에 super 호출을 포함해야 합니다.
20.5.7.1.1 AggregateError ( errors ,
message [ , options ] )
이 함수가 호출될 때 다음 단계를 수행합니다:
NewTarget이 undefined 이면 newTarget 을 활성 함수 객체 로 설정하고, 아니면
newTarget 을 NewTarget으로 설정합니다.
O 를 ? OrdinaryCreateFromConstructor (newTarget ,
"%AggregateError.prototype%" , « [[ErrorData]] »)로 설정합니다.
message 가 undefined 가 아니면,
msg 를 ? ToString (message )로
설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"message" , msg )를 수행합니다.
? InstallErrorCause (O ,
options )를 수행합니다.
errorsList 를 ? IteratorToList (? GetIterator (errors ,
sync ))로 설정합니다.
! DefinePropertyOrThrow (O ,
"errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errorsList ) }를
수행합니다.
O 를 반환합니다.
20.5.7.2 AggregateError 생성자의 프로퍼티
AggregateError 생성자 :
[[Prototype]] 내부 슬롯의 값은 %Error% 입니다.
다음 프로퍼티를 가집니다:
20.5.7.2.1 AggregateError.prototype
AggregateError.prototype의 초기 값은 %AggregateError.prototype% 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }입니다.
20.5.7.3 AggregateError 프로토타입 객체의 프로퍼티
AggregateError 프로토타입 객체 :
%AggregateError.prototype% 입니다.
일반
객체 입니다.
Error 인스턴스나 AggregateError 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지
않습니다.
[[Prototype]] 내부 슬롯의 값은 %Error.prototype% 입니다.
20.5.7.3.1 AggregateError.prototype.constructor
AggregateError.prototype.constructor의 초기 값은 %AggregateError% 입니다.
20.5.7.3.2 AggregateError.prototype.message
AggregateError.prototype.message의 초기 값은 빈 문자열입니다.
20.5.7.3.3 AggregateError.prototype.name
AggregateError.prototype.name의 초기 값은
"AggregateError" 입니다.
20.5.7.4 AggregateError 인스턴스의 프로퍼티
AggregateError 인스턴스는 일반 객체 로, AggregateError 프로토타입
객체 로부터 프로퍼티를 상속하고 [[ErrorData]]
내부 슬롯의 값은 undefined 입니다. [[ErrorData]] 의 유일하게 명시된
사용은 Object.prototype.toString
(20.1.3.6 ) 및
Error.isError (20.5.2.1 )에서 Error,
AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.
20.5.8 Error 객체를 위한 추상 연산
20.5.8.1 InstallErrorCause ( O , options )
추상 연산 InstallErrorCause는 O (객체)와 options (ECMAScript 언어 값 )를 인자로 받아
unused를 포함하는 정상 완료
또는 throw 완료 를 반환합니다.
options 에 "cause" 프로퍼티가 있을 때 O 에
"cause" 프로퍼티를 생성하기 위해 사용됩니다. 호출 시 다음 단계를 수행합니다:
options 가 객체이고 ? HasProperty (options ,
"cause" )가 true 이면,
cause 를 ? Get (options ,
"cause" )로 설정합니다.
CreateNonEnumerableDataPropertyOrThrow (O ,
"cause" , cause )를 수행합니다.
unused 를 반환합니다.
21 숫자와 날짜
21.1 Number 객체
21.1.1 Number 생성자
Number 생성자 :
%Number% 임.
"Number" 속성의 초기값임 글로벌 객체 의.
생성자 로 호출될
때 새로운 Number 객체를 생성하고 초기화함.
함수로 호출될 때 타입 변환을 수행함, 생성자 로 호출되는 것이 아니라면.
클래스 정의의 extends 절 값으로 사용될 수 있음. Number 생성자 에 대한 super 호출을 포함해야
하며, [[NumberData]] 내부 슬롯으로 서브클래스 인스턴스를 생성/초기화함.
21.1.1.1 Number ( value )
이 함수는 호출 시 다음 단계를 수행함:
value 가 존재하면,
prim 에 ? ToNumeric (value )를
할당한다.
prim BigInt인
경우 , n 에 𝔽 (ℝ (prim ))을 할당한다.
그렇지 않으면 n 에 prim 을 할당한다.
그렇지 않으면,
n 에 +0 𝔽 을 할당한다.
NewTarget이 undefined 라면 n 을 반환한다.
O 에 ? OrdinaryCreateFromConstructor (NewTarget,
"%Number.prototype%" , « [[NumberData]] » )를 할당한다.
O .[[NumberData]] 를 n 으로 설정한다.
O 를 반환한다.
21.1.2 Number 생성자의 속성
Number 생성자 :
21.1.2.1 Number.EPSILON
Number.EPSILON의 값은 Number 값 중 1과 1보다 큰 가장 작은 값의 차이의 크기이며, 이는 약
2.2204460492503130808472633361816 × 10-16 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.2 Number.isFinite ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 Number가
아니면 , false 를 반환한다.
number 가 유한 값이
아니면 , false 를 반환한다.
그렇지 않으면 true 를 반환한다.
21.1.2.3 Number.isInteger ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 정수 Number 라면, true 를
반환한다.
false 를 반환한다.
21.1.2.4 Number.isNaN ( number )
이 함수는 호출 시 다음 단계를 수행함:
number 가 Number가
아니면 , false 를 반환한다.
number 가 NaN 이면, true 를 반환한다.
그렇지 않으면 false 를 반환한다.
참고
이 함수는 전역 isNaN 함수 (19.2.3 )와 다르게, 인수를 Number로 변환하지 않고
NaN 여부를 판단함.
21.1.2.5 Number.isSafeInteger ( number )
참고
정수
n 이 " 안전한 정수 "이려면 Number
값 n 이 Number 값 인 다른 정수 와 같지 않아야 함.
이 함수는 호출 시 다음 단계를 수행함:
number 가 정수 Number 이면,
abs (ℝ (number )) ≤
253 - 1이면, true 를 반환한다.
false 를 반환한다.
21.1.2.6 Number.MAX_SAFE_INTEGER
참고
IEEE
754-2019 의 정밀도 제한으로 인해, Number 값 이 정수
Number.MAX_SAFE_INTEGER보다 크면, 적어도 하나의 다른 정수 와 값을 공유하게 된다.
이런 큰 정수 는
안전하지
않음 이며, Number 값으로 정확히 표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로
9007199254740992와 9007199254740993 모두
9007199254740992 𝔽 값을 가짐.
Number.MAX_SAFE_INTEGER의 값은
9007199254740991 𝔽 (𝔽 (253 - 1))임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.7 Number.MAX_VALUE
Number.MAX_VALUE의 값은 유한 한 값 중 Number 타입 의 가장 큰 양수
값이며, 이는 약 1.7976931348623157 × 10308 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.8 Number.MIN_SAFE_INTEGER
참고
IEEE
754-2019 의 정밀도 제한으로 인해, Number 값 이 정수
Number.MIN_SAFE_INTEGER보다 작으면, 적어도 하나의 다른 정수 와 값을 공유하게 된다.
이런 큰 음수 정수 는 안전하지 않음 이며, Number 값으로 정확히
표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로 -9007199254740992와
-9007199254740993 모두 -9007199254740992 𝔽
값을 가짐.
Number.MIN_SAFE_INTEGER의 값은
-9007199254740991 𝔽 (𝔽 (-(253 - 1)))임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.9 Number.MIN_VALUE
Number.MIN_VALUE의 값은 Number
타입 의 가장 작은 양수 값이며, 이는 약 5 ×
10-324 임.
IEEE
754-2019 의 배정밀도 이진 표현에서 가장 작은 값은 비정규화된 숫자임. 만약 구현이 비정규화 값을 지원하지 않으면
Number.MIN_VALUE의 값은 구현이 실제로 표현할 수 있는 가장 작은 0이 아닌 양수 값이어야 함.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.10 Number.NaN
Number.NaN의 값은 NaN 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.11 Number.NEGATIVE_INFINITY
Number.NEGATIVE_INFINITY의 값은 -∞ 𝔽 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.12 Number.parseFloat ( string )
"parseFloat" 속성의 초기값은 %parseFloat% 임.
21.1.2.13 Number.parseInt ( string , radix
)
"parseInt" 속성의 초기값은 %parseInt% 임.
21.1.2.14 Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY의 값은 +∞ 𝔽 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.2.15 Number.prototype
Number.prototype의 초기값은 Number 프로토타입
객체 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.1.3 Number 프로토타입 객체의 속성
Number 프로토타입 객체 :
%Number.prototype% 임.
일반
객체 임.
스스로 Number 객체이며, [[NumberData]] 내부 슬롯 값은
+0 𝔽 임.
[[Prototype]] 내부 슬롯 값은 %Object.prototype% 임.
특별히 명시하지 않으면, 아래 정의된 Number 프로토타입 객체의 메서드는 제네릭이 아니며, this 값은 반드시 Number 값 또는
[[NumberData]] 내부 슬롯이 Number 값으로 초기화된 객체여야 함.
메서드 명세 내 "this Number 값"이라는 표현은 추상 연산 ThisNumberValue 를 해당 메서드 호출의
this 값으로 호출한 결과임.
21.1.3.1 Number.prototype.constructor
Number.prototype.constructor의 초기값은 %Number% 입니다.
21.1.3.2 Number.prototype.toExponential (
fractionDigits )
이 메서드는 이 Number 값을 십진수 지수 표기법으로 표현한 문자열을 반환합니다. 지수 앞에는 한 자리, fractionDigits 이후로는
fractionDigits 개의 자릿수가 나타납니다. fractionDigits 가
undefined 인 경우, 그 Number를 고유하게 지정하기 위해 필요한 만큼의 자릿수를 포함합니다 (ToString 처럼, 단 이 경우
항상 지수 표기법으로 출력됨).
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
f 에 ? ToIntegerOrInfinity (fractionDigits )를
할당한다.
Assert :
fractionDigits 가 undefined 이면 f 는 0이다.
x 가 유한
값 이 아니면, Number::toString (x ,
10)을 반환한다.
f < 0 또는 f > 100이면 RangeError 예외를
던진다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
s 에 "-" 를 할당한다.
x 를 -x 로 설정한다.
x = 0이면
m 에 f + 1 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
e 에 0을 할당한다.
그 외에는,
fractionDigits 가 undefined 가 아니면
10f ≤ n < 10f +
1 이면서, n × 10e -
f - x 가 0에 가장 가까운 e 와
n 을 정수 로 할당한다. 만약 두 쌍이 있다면,
n × 10e - f 가 더 큰 쌍을
선택한다.
그 외에는
ff ≥ 0, 10ff ≤ n <
10ff + 1 , 𝔽 (n ×
10e - ff )가 𝔽 (x )이며,
ff 가 가장 작은 e , n , ff 를
정수 로 할당한다. n 의 십진수
표현의 자릿수는 ff +1이고, n 은 10으로 나누어떨어지지 않으며, 가장 끝의
숫자가 고유하게 결정되지 않을 수 있음.
f 를 ff 로 설정한다.
m 에 n 의 십진수 표현(앞자리 0 없이)의 문자열을 할당한다.
f ≠ 0이면
a 를 m 의 첫 번째 코드 유닛으로 할당한다.
b 를 m 의 나머지 f 개의 코드 유닛으로 할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를 이어붙인다.
e = 0이면
c 에 "+" 를 할당한다.
d 에 "0" 를 할당한다.
그 외에는,
e > 0이면
c 에 "+" 를 할당한다.
그 외에는
Assert : e < 0.
c 에 "-" 를 할당한다.
e 를 -e 로 설정한다.
d 를 e 의 십진수 표현(앞자리 0 없이) 문자열로 할당한다.
m 을 string-concatenation 을 이용해
m , "e" , c , d 를 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
참고
위 규칙보다 더 정확한 변환을 제공하는 구현의 경우, 아래 대안 step 10.b.i 를
지침으로 사용하는 것이 권장됩니다:
f ≥ 0, 10f ≤ n <
10f + 1 , 𝔽 (n × 10e -
f )가 𝔽 (x )이며, f 가 가장 작은
e , n , f 를 정수 로 할당한다. n
후보가 여러 개일 경우, 𝔽 (n × 10e -
f )가 𝔽 (x )에 가장 가까운 값을 선택한다. 두 개가 있으면
짝수인 값을 고른다.
21.1.3.3 Number.prototype.toFixed ( fractionDigits )
참고 1
이 메서드는 이 Number 값을 십진수 고정 소수점 표기법으로 표현한 문자열을 반환하며, 소수점 이하 fractionDigits
개의 자릿수를 포함합니다. fractionDigits 가 undefined 이면 0으로 간주됩니다.
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
f 에 ? ToIntegerOrInfinity (fractionDigits )를
할당한다.
Assert :
fractionDigits 가 undefined 이면 f 는 0이다.
f 가 유한
값 이 아니면 RangeError 예외를 던진다.
f < 0 또는 f > 100이면 RangeError 예외를
던진다.
x 가 유한
값 이 아니면 Number::toString (x ,
10)을 반환한다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
s 에 "-" 를 할당한다.
x 를 -x 로 설정한다.
x ≥ 1021 이면
m 에 ! ToString (𝔽 (x ))을 할당한다.
그 외에는,
n 을 n / 10f - x 가 0에 가장
가까운 정수 로 할당한다. 두 개라면 더 큰 n 을
선택한다.
n = 0이면 m 에 "0" 을, 아니면 n 의
십진수 표현(앞자리 0 없음) 문자열을 할당한다.
f ≠ 0이면
k 에 m 의 길이를 할당한다.
k ≤ f 이면
z 에 f + 1 - k 만큼 코드 유닛
0x0030(DIGIT ZERO)으로 구성된 문자열을 할당한다.
m 을 string-concatenation 을
이용해 z 와 m 을 이어붙인다.
k 를 f + 1로 설정한다.
a 에 m 의 처음 k - f 개의 코드 유닛을
할당한다.
b 에 m 의 나머지 f 개의 코드 유닛을 할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
참고 2
toFixed의 출력은 일부 값에서 toString보다 더 정확할 수 있습니다. toString은 인접
Number 값들과 구별할 만큼만 유효 자릿수를 출력합니다. 예를 들어,
(1000000000000000128).toString()은
"1000000000000000100" 을 반환하지만,
(1000000000000000128).toFixed(0)은
"1000000000000000128" 을 반환합니다.
21.1.3.4 Number.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API가 포함되지 않은
구현에서는 아래 명세를 따릅니다:
이 메서드는 현재 호스트
환경 로캘의 규칙에 따라 이 Number 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현
정의 이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.
이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안
됩니다.
21.1.3.5 Number.prototype.toPrecision ( precision )
이 메서드는 이 Number 값을 십진수 지수 표기법(지수 앞에 한 자리, precision - 1 개의 소수점 이하 자릿수) 또는
precision 개의 유효 자릿수를 가진 고정 소수점 표기법으로 표현한 문자열을 반환합니다. precision 이
undefined 이면 ToString 을 호출합니다.
호출될 때 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
precision 이 undefined 이면 ! ToString (x )을 반환한다.
p 에 ? ToIntegerOrInfinity (precision )을
할당한다.
x 가 유한
값 이 아니면 Number::toString (x ,
10)을 반환한다.
p < 1 또는 p > 100이면 RangeError 예외를
던진다.
x 를 ℝ (x )로 설정한다.
s 를 빈 문자열로 할당한다.
x < 0이면
코드 유닛 0x002D(HYPHEN-MINUS)를 s 에 할당한다.
x 를 -x 로 설정한다.
x = 0이면
m 에 p 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
e 에 0을 할당한다.
그 외에는,
10p - 1 ≤ n <
10p 이고, n × 10e -
p + 1 - x 가 0에 가장 가까운 e ,
n 을 정수 로 할당한다. 두 쌍이 있다면, n ×
10e - p + 1 이 더 큰 쌍을 선택한다.
m 에 n 의 십진수 표현(앞자리 0 없음) 문자열을 할당한다.
e < -6 또는 e ≥ p 이면
Assert : e ≠ 0.
p ≠ 1이면
a 에 m 의 첫 번째 코드 유닛을 할당한다.
b 에 m 의 나머지 p - 1개 코드 유닛을
할당한다.
m 을 string-concatenation 을
이용해 a , "." , b 를
이어붙인다.
e > 0이면
코드 유닛 0x002B(PLUS SIGN)를 c 에 할당한다.
그 외에는
Assert : e
< 0.
코드 유닛 0x002D(HYPHEN-MINUS)를 c 에 할당한다.
e 를 -e 로 설정한다.
d 를 e 의 십진수 표현(앞자리 0 없음) 문자열로 할당한다.
string-concatenation 을
이용해 s , m , 코드 유닛 0x0065('e'), c ,
d 를 이어붙인 값을 반환한다.
e = p - 1이면 string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
e ≥ 0이면
m 을 string-concatenation 을
이용해 m 의 처음 e +1개 코드 유닛, 코드 유닛 0x002E(FULL STOP), 나머지
p -(e +1)개 코드 유닛을 이어붙인다.
그 외에는,
m 을 string-concatenation 을
이용해 코드 유닛 0x0030(DIGIT ZERO), 코드 유닛 0x002E(FULL STOP), -(e + 1)
개의 코드 유닛 0x0030(DIGIT ZERO), 그리고 m 문자열을 이어붙인다.
string-concatenation 을 이용해
s 와 m 을 이어붙인 값을 반환한다.
21.1.3.6 Number.prototype.toString ( [ radix ] )
참고
선택적 radix 는 정수 Number 값이어야 하며, 2에서
36까지의 구간 내에 있어야 합니다. radix 가
undefined 이면 10 𝔽 이 사용됩니다.
이 메서드는 호출 시 다음 단계를 수행합니다:
x 에 ? ThisNumberValue (this
값)을 할당한다.
radix 가 undefined 이면 radixMV 를 10으로 할당한다.
그 외에는 radixMV 에 ? ToIntegerOrInfinity (radix )를
할당한다.
radixMV 가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
Number::toString (x ,
radixMV )를 반환한다.
이 메서드는 제네릭이 아니며, this 값이 Number 또는 Number
객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.
이 메서드의 "length" 속성은 1 𝔽 입니다.
21.1.3.7 Number.prototype.valueOf ( )
? ThisNumberValue (this
값)을 반환한다.
21.1.3.7.1 ThisNumberValue ( value )
ThisNumberValue 추상 연산은 value ( ECMAScript 언어
값 ) 인수를 받아, Number를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
value 가 Number 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[NumberData]] 내부 슬롯이 있으면,
n 에 value .[[NumberData]] 를
할당한다.
Assert : n 이 Number 임을
보장한다.
n 을 반환한다.
TypeError 예외를 던진다.
21.1.4 Number 인스턴스의 속성
Number 인스턴스는 일반
객체 이며, Number 프로토타입
객체 로부터 속성을 상속받습니다. 또한 [[NumberData]] 내부 슬롯을 가지며,
이 슬롯 값이 이 Number 객체가 나타내는 Number 값입니다.
21.2 BigInt 객체
21.2.1 BigInt 생성자
BigInt 생성자 :
%BigInt% 임.
"BigInt" 속성의 초기값이며, 전역 객체 에 존재함.
함수로 호출될 때 타입 변환을 수행하며, 생성자 로 호출되는 것이 아님.
new 연산자와 함께 사용하거나 서브클래싱 목적으로 설계되지 않았음. 클래스 정의의 extends 값으로 사용할 수
있지만, BigInt 생성자 에 대한 super 호출은 예외를 발생시킴.
21.2.1.1 BigInt ( value )
이 함수는 호출 시 다음 단계를 수행합니다:
NewTarget이 undefined 가 아니면 TypeError 예외를 던진다.
prim 에 ? ToPrimitive (value ,
number )를 할당한다.
prim 이 Number 이면,
? NumberToBigInt (prim )을
반환한다.
그 외에는 ? ToBigInt (prim )을 반환한다.
21.2.1.1.1 NumberToBigInt ( number )
NumberToBigInt 추상 연산은 number (Number)를 인수로 받아 BigInt를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
number 가 정수 Number 가 아니면,
RangeError 예외를 던진다.
ℤ (ℝ (number ))를
반환한다.
21.2.2 BigInt 생성자의 속성
BigInt 생성자 :
21.2.2.1 BigInt.asIntN ( bits , bigint )
이 함수는 호출 시 다음 단계를 수행합니다:
bits 에 ? ToIndex (bits )를 할당한다.
bigint 에 ? ToBigInt (bigint )를 할당한다.
mod 에 ℝ (bigint ) modulo
2bits 를 할당한다.
mod ≥ 2bits - 1 이면 ℤ (mod -
2bits )를 반환하고, 아니면 ℤ (mod )를 반환한다.
21.2.2.2 BigInt.asUintN ( bits , bigint )
이 함수는 호출 시 다음 단계를 수행합니다:
bits 에 ? ToIndex (bits )를 할당한다.
bigint 에 ? ToBigInt (bigint )를 할당한다.
ℤ (ℝ (bigint )
modulo
2bits )를 반환한다.
21.2.2.3 BigInt.prototype
BigInt.prototype의 초기값은 BigInt 프로토타입
객체 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.2.3 BigInt 프로토타입 객체의 속성
BigInt 프로토타입 객체 :
메서드 명세 내 "this BigInt 값"이라는 표현은 ThisBigIntValue 를 해당 메서드 호출의
this 값으로 호출한 결과임.
21.2.3.1 BigInt.prototype.constructor
BigInt.prototype.constructor의 초기값은 %BigInt% 임.
21.2.3.2 BigInt.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API를 포함하지 않은
구현에서는 아래 명세를 따릅니다:
이 메서드는 현재 호스트
환경 의 로캘 규칙에 따라 이 BigInt 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현
정의 이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.
이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안
됩니다.
21.2.3.3 BigInt.prototype.toString ( [ radix ] )
참고
선택적 radix 는 정수 Number 값이어야 하며, 2에서
36까지의 구간 내에 있어야 합니다. radix 가
undefined 이면 10 𝔽 이 사용됩니다.
이 메서드는 호출 시 다음 단계를 수행합니다:
x 에 ? ThisBigIntValue (this
값)을 할당한다.
radix 가 undefined 이면 radixMV 를 10으로 할당한다.
그 외에는 radixMV 에 ? ToIntegerOrInfinity (radix )를
할당한다.
radixMV 가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
BigInt::toString (x ,
radixMV )를 반환한다.
이 메서드는 제네릭이 아니며, this 값이 BigInt 또는 BigInt
객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.
21.2.3.4 BigInt.prototype.valueOf ( )
? ThisBigIntValue (this
값)을 반환한다.
21.2.3.4.1 ThisBigIntValue ( value )
ThisBigIntValue 추상 연산은 value ( ECMAScript 언어
값 ) 인수를 받아, BigInt를 포함하는 정상
완료 또는 throw
완료 를 반환합니다. 호출 시 다음 단계를 수행합니다:
value 가 BigInt 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[BigIntData]] 내부 슬롯이 있으면,
Assert : value .[[BigIntData]] 가 BigInt 임을
보장한다.
value .[[BigIntData]] 를 반환한다.
TypeError 예외를 던진다.
21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열
"BigInt" 입니다.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }임.
21.2.4 BigInt 인스턴스의 속성
BigInt 인스턴스는 일반
객체 이며, BigInt 프로토타입
객체 로부터 속성을 상속받습니다. 또한 [[BigIntData]] 내부 슬롯을 가지며,
이 슬롯 값이 이 BigInt 객체가 나타내는 BigInt 값입니다.
21.3 Math 객체
Math 객체:
%Math% 임.
"Math" 속성의 초기값이며, 글로벌 객체 에 있음.
일반
객체 임.
[[Prototype]] 내부 슬롯이 있으며, 값은 %Object.prototype% 임.
함수
객체 가 아님.
[[Construct]] 내부 메서드가 없으며, new 연산자와 함께 생성자 로 사용할 수 없음.
[[Call]] 내부 메서드가 없으며, 함수로 호출할 수 없음.
참고
이 명세에서 “x의
Number 값 ”라는 문구는 6.1.6.1 에 정의된 기술적
의미를 가짐.
21.3.1 Math 객체의 값 속성
21.3.1.1 Math.E
e의 Number
값 , 자연로그의 밑, 약 2.7182818284590452354.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.2 Math.LN10
10의 자연로그의
Number 값 , 약 2.302585092994046.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.3 Math.LN2
2의 자연로그의 Number
값 , 약 0.6931471805599453.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.4 Math.LOG10E
e의 상용로그의 Number
값 , 자연로그의 밑의 상용로그; 약 0.4342944819032518.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.LOG10E의 값은 Math.LN10의 값의 역수에 가까움.
21.3.1.5 Math.LOG2E
e의 밑이 2인 로그의
Number 값 , 자연로그의 밑의 밑이 2인 로그; 약 1.4426950408889634.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.LOG2E의 값은 Math.LN2의 값의 역수에 가까움.
21.3.1.6 Math.PI
π의 Number
값 , 원의 둘레와 지름의 비율, 약 3.1415926535897932.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.7 Math.SQRT1_2
½의 제곱근의 Number
값 , 약 0.7071067811865476.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
참고
Math.SQRT1_2의 값은 Math.SQRT2의 값의 역수에 가까움.
21.3.1.8 Math.SQRT2
2의 제곱근의 Number
값 , 약 1.4142135623730951.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }임.
21.3.1.9 Math [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열
"Math" 임.
이 속성의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }임.
21.3.2 Math 객체의 함수 속성
참고
acos, acosh, asin,
asinh, atan, atanh, atan2,
cbrt, cos, cosh, exp,
expm1, hypot, log, log1p,
log2, log10, pow, random,
sin, sinh, tan, tanh 함수의 동작은 여기서
정확하게 명세되어 있지 않으며, 경계값에 대해 특정 결과만 요구됩니다. 그 외의 인자 값에 대해서는 일반적인 수학 함수의 근삿값을 계산하도록 되어 있으나,
근사 알고리즘 선택에는 여지가 있습니다. 일반적인 의도는 구현자가 해당 하드웨어 플랫폼의 C 프로그래머가 사용할 수 있는 수학 라이브러리를
ECMAScript에 사용할 수 있도록 하는 것입니다.
알고리즘 선택은 구현에 맡기지만, IEEE 754-2019 산술에 대한 근사 알고리즘으로 Sun
Microsystems의 자유 배포 수학 라이브러리 fdlibm (http://www.netlib.org/fdlibm ) 사용을 권장합니다(명세상
필수는 아님).
21.3.2.1 Math.abs ( x )
이 함수는 x 의 절댓값을 반환합니다; 결과는 x 와 크기는 같으나 부호는 양수입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면 NaN 을 반환한다.
n 이 -0 𝔽 이면
+0 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면
+∞ 𝔽 을 반환한다.
n < -0 𝔽 이면 -n 을 반환한다.
n 을 반환한다.
21.3.2.2 Math.acos ( x )
이 함수는 x 의 아크코사인(역삼각함수 cos-1 )을 반환합니다. 결과는 라디안 단위이며 +0𝔽 에서 𝔽 (π)까지의 구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이거나 n >
1 𝔽 이거나 n <
-1 𝔽 이면 NaN 을 반환한다.
n 이 1 𝔽 이면
+0 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크코사인임.
21.3.2.3 Math.acosh ( x )
이 함수는 x 의 역쌍곡코사인(아크코사인 하이퍼볼릭)을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면
n 을 반환한다.
n 이 1 𝔽 이면
+0 𝔽 을 반환한다.
n < 1 𝔽 이면 NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡코사인임.
21.3.2.4 Math.asin ( x )
이 함수는 x 의 아크사인(역삼각함수 sin-1 )을 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의
구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n > 1 𝔽 또는 n <
-1 𝔽 이면 NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크사인임.
21.3.2.5 Math.asinh ( x )
이 함수는 x 의 역쌍곡사인(아크사인 하이퍼볼릭)을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면 n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡사인임.
21.3.2.6 Math.atan ( x )
이 함수는 x 의 아크탄젠트(역삼각함수 tan-1 )를 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의
구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n 이 +∞ 𝔽 이면 구현 근삿값 Number 값으로 π/2를
반환한다.
n 이 -∞ 𝔽 이면 구현 근삿값 Number 값으로 -π/2를
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
아크탄젠트임.
21.3.2.7 Math.atanh ( x )
이 함수는 x 의 역쌍곡탄젠트(아크탄젠트 하이퍼볼릭)를 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면 n 을 반환한다.
n > 1 𝔽 또는 n <
-1 𝔽 이면 NaN 을 반환한다.
n 이 1 𝔽 이면
+∞ 𝔽 을 반환한다.
n 이 -1 𝔽 이면
-∞ 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
역쌍곡탄젠트임.
21.3.2.8 Math.atan2 ( y , x )
이 함수는 인자 y 와 x 의 몫 y /
x 의 아크탄젠트(역삼각함수 tan-1 )를 반환합니다. y 와
x 의 부호로 결과의 사분면이 결정됩니다. 두 인자에서 y 가 먼저, x 가 두 번째임은 의도적이고
전통적입니다. 결과는 라디안 단위이며 -π에서 +π까지의 구간 에 있습니다.
호출 시 다음 단계를 수행합니다:
ny 에 ? ToNumber (y )를 할당한다.
nx 에 ? ToNumber (x )를 할당한다.
ny 가 NaN 이거나 nx 가 NaN 이면
NaN 을 반환한다.
ny 가 +∞ 𝔽 이면,
nx 가 +∞ 𝔽 이면 구현 근삿값 Number 값으로
π/4를 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
3π/4를 반환한다.
그 외에는 구현 근삿값 Number 값으로
π/2를 반환한다.
ny 가 -∞ 𝔽 이면,
nx 가 +∞ 𝔽 이면 구현 근삿값 Number 값으로
-π/4를 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
-3π/4를 반환한다.
그 외에는 구현 근삿값 Number 값으로
-π/2를 반환한다.
ny 가 +0 𝔽 이면,
nx > +0 𝔽 또는 nx 가
+0 𝔽 이면 +0 𝔽 을
반환한다.
그 외에는 구현 근삿값 Number 값으로
π를 반환한다.
ny 가 -0 𝔽 이면,
nx > +0 𝔽 또는 nx 가
+0 𝔽 이면 -0 𝔽 을
반환한다.
그 외에는 구현 근삿값 Number 값으로
-π를 반환한다.
Assert :
ny 는 유한
값 이며 +0 𝔽 또는
-0 𝔽 이 아님.
ny > +0 𝔽 이면,
nx 가 +∞ 𝔽 이면
+0 𝔽 을 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
π를 반환한다.
nx 가 +0 𝔽 또는
-0 𝔽 이면 구현 근삿값 Number 값으로
π/2를 반환한다.
ny < -0 𝔽 이면,
nx 가 +∞ 𝔽 이면
-0 𝔽 을 반환한다.
nx 가 -∞ 𝔽 이면 구현 근삿값 Number 값으로
-π를 반환한다.
nx 가 +0 𝔽 또는
-0 𝔽 이면 구현 근삿값 Number 값으로
-π/2를 반환한다.
Assert :
nx 는 유한
값 이며 +0 𝔽 또는
-0 𝔽 이 아님.
r 에 abs (ℝ (ny ) / ℝ (nx ))의 아크탄젠트를 할당한다.
nx < -0 𝔽 이면,
ny > +0 𝔽 이면 r 을 π -
r 로 설정한다.
그 외에는 r 을 -π + r 로 설정한다.
그 외에는,
ny < -0 𝔽 이면 r 을
-r 로 설정한다.
구현 근삿값 Number 값으로
r 을 반환한다.
21.3.2.9 Math.cbrt ( x )
이 함수는 x 의 세제곱근을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
세제곱근임.
21.3.2.10 Math.ceil ( x )
이 함수는 x 보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환합니다.
x 가 이미 정수 Number 이면, 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < -0 𝔽 이고 n >
-1 𝔽 이면, -0 𝔽 을 반환한다.
n 이 정수 Number 이면, n 을 반환한다.
n 보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고
Math.ceil(x)의 값은 -Math.floor(-x)의 값과 같습니다.
21.3.2.11 Math.clz32 ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToUint32 (x )를 할당한다.
p 에 n 의 부호 없는 32비트 이진 표현에서 앞에 오는 0 비트 개수를 할당한다.
𝔽 (p )를
반환한다.
참고
n 이 +0 𝔽 또는
-0 𝔽 이면, 이 메서드는 32 𝔽 를
반환합니다. n 의 32비트 이진 인코딩의 최상위 비트가 1이면, 이 메서드는
+0 𝔽 을 반환합니다.
21.3.2.12 Math.cos ( x )
이 함수는 x 의 코사인 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니면, NaN 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
코사인임.
21.3.2.13 Math.cosh ( x )
이 함수는 x 의 쌍곡코사인 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, +∞ 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡코사인임.
참고
Math.cosh(x)의 값은 (Math.exp(x) + Math.exp(-x)) / 2의 값과 같습니다.
21.3.2.14 Math.exp ( x )
이 함수는 x 의 지수 함수 값을 반환합니다 (e 를 x 제곱한 값, e 는 자연로그의 밑).
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, 1 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면,
+0 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 지수
함수임.
21.3.2.15 Math.expm1 ( x )
이 함수는 x 의 지수 함숫값에서 1을 뺀 값을 반환합니다 (e 를 x 제곱한 값에서 1을 뺌,
e 는 자연로그의 밑). x 가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n 이 -∞ 𝔽 이면,
-1 𝔽 을 반환한다.
exp 에 ℝ (n )의 지수 함수 값을 할당한다.
구현 근삿값 Number 값을 반환하는데,
exp - 1임.
21.3.2.16 Math.floor ( x )
이 함수는 x 보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환합니다.
x 가 이미 정수 Number 이면, 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < 1 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n 이 정수 Number 이면, n 을 반환한다.
n 보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고
Math.floor(x)의 값은 -Math.ceil(-x)의 값과 같습니다.
21.3.2.17 Math.fround ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 ,
-∞ 𝔽 중 하나이면, n 을 반환한다.
n32 에 n 을 IEEE
754-2019 binary32 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
n64 에 n32 를 IEEE
754-2019 binary64 형식으로 변환한 결과를 할당한다.
n64 에 해당하는 ECMAScript Number 값을 반환한다.
21.3.2.18 Math.f16round ( x )
이 함수는 호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 이면, NaN 을 반환한다.
n 이 +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 ,
-∞ 𝔽 중 하나이면, n 을 반환한다.
n16 에 n 을 IEEE
754-2019 binary16 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
n64 에 n16 을 IEEE
754-2019 binary64 형식으로 변환한 결과를 할당한다.
n64 에 해당하는 ECMAScript Number 값을 반환한다.
참고
이 연산은 binary32로 캐스팅한 뒤 binary16으로 캐스팅하는 것과 동일하지 않습니다. 이중 반올림(double-rounding)이 발생할 수
있기 때문입니다: 예를 들어 k =
1.00048828125000022204 𝔽 의 경우,
Math.f16round(k )는 1.0009765625 𝔽 이지만
Math.f16round(Math.fround(k ))는 1 𝔽 입니다.
모든 플랫폼이 binary64에서 binary16으로의 캐스팅을 기본 지원하지는 않습니다. 이를 위한 다양한 라이브러리가 있으며, MIT 라이선스의 half 라이브러리 등이 있습니다. 또는 binary64를
roundTiesToEven으로 binary32로 먼저 캐스팅한 다음, 그 결과가 잘못된 이중 반올림을 유발할 수 있는지 확인하는 방법도 있습니다.
문제가 될 수 있는 경우는 mantissa를 조정하여 roundTiesToOdd로 캐스팅한 결과와 같도록 만든 뒤, 다시
roundTiesToEven으로 binary16으로 캐스팅하면 올바른 값을 얻을 수 있습니다.
21.3.2.19 Math.hypot ( ...args )
0개 이상의 인자를 받아, 인자들의 제곱의 합의 제곱근을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
coerced 의 각 요소 number 에 대해,
number 가 +∞ 𝔽 또는
-∞ 𝔽 이면, +∞ 𝔽 을
반환한다.
onlyZero 에 true 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 +0 𝔽 또는
-0 𝔽 이 아니면, onlyZero 를
false 로 설정한다.
onlyZero 가 true 이면, +0 𝔽 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
coerced 의 각 요소의 수학적 값 의 제곱의 합의 제곱근임.
이 함수의 "length" 속성은 2 𝔽 입니다.
참고
구현체는 2개 이상의 인자로 호출될 때 오버플로우와 언더플로우로 인한 정밀도 손실을 주의해야 합니다.
21.3.2.20 Math.imul ( x , y )
이 함수는 호출 시 다음 단계를 수행합니다:
a 에 ℝ (?
ToUint32 (x ))를 할당한다.
b 에 ℝ (?
ToUint32 (y ))를 할당한다.
product 에 (a × b ) modulo 232 를
할당한다.
product ≥ 231 이면, 𝔽 (product - 232 )를 반환하고, 아니면
𝔽 (product )를 반환한다.
21.3.2.21 Math.log ( x )
이 함수는 x 의 자연로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
자연로그임.
21.3.2.22 Math.log1p ( x )
이 함수는 1 + x 의 자연로그 값을 반환합니다. x 가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n 이 -1 𝔽 이면,
-∞ 𝔽 을 반환한다.
n < -1 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데, 1
+ ℝ (n )의
자연로그임.
21.3.2.23 Math.log10 ( x )
이 함수는 x 의 밑이 10인 로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 밑이
10인 로그임.
21.3.2.24 Math.log2 ( x )
이 함수는 x 의 밑이 2인 로그 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN 또는 +∞ 𝔽 이면,
n 을 반환한다.
n 이 1 𝔽 이면,
+0 𝔽 을 반환한다.
n 이 +0 𝔽 또는
-0 𝔽 이면, -∞ 𝔽 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 밑이
2인 로그임.
21.3.2.25 Math.max ( ...args )
0개 이상의 인자를 받아, 각 인자에 ToNumber 를 호출하고 그 결과 값 중 가장 큰 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
highest 에 -∞ 𝔽 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 +0 𝔽 이고 highest 가
-0 𝔽 이면, highest 를
+0 𝔽 로 설정한다.
number > highest 이면, highest 를
number 로 설정한다.
highest 를 반환한다.
참고
가장 큰 값을 결정하는 값의 비교는 IsLessThan 알고리즘을 사용하지만
+0 𝔽 은 -0 𝔽 보다 더 큰 것으로
간주합니다.
이 함수의 "length" 속성은 2 𝔽 입니다.
21.3.2.26 Math.min ( ...args )
0개 이상의 인자를 받아, 각 인자에 ToNumber 를 호출하고 그 결과 값 중 가장 작은 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
coerced 에 새로운 빈 List 를 할당한다.
args 의 각 요소 arg 에 대해,
n 에 ? ToNumber (arg )를 할당한다.
n 을 coerced 에 추가한다.
lowest 에 +∞ 𝔽 를 할당한다.
coerced 의 각 요소 number 에 대해,
number 가 NaN 이면, NaN 을 반환한다.
number 가 -0 𝔽 이고 lowest 가
+0 𝔽 이면, lowest 를
-0 𝔽 로 설정한다.
number < lowest 이면, lowest 를
number 로 설정한다.
lowest 를 반환한다.
참고
가장 큰 값을 결정하는 비교는 IsLessThan 알고리즘을 사용하지만,
+0 𝔽 은 -0 𝔽 보다 더 큰 것으로
간주합니다.
이 함수의 "length" 속성은 2 𝔽 입니다.
21.3.2.27 Math.pow ( base , exponent )
이 함수는 호출 시 다음 단계를 수행합니다:
base 에 ? ToNumber (base )를 할당한다.
exponent 에 ? ToNumber (exponent )를 할당한다.
Number::exponentiate (base ,
exponent )를 반환한다.
21.3.2.28 Math.random ( )
이 함수는 양수 부호를 가지며, +0 𝔽 이상 1 𝔽 미만인
Number 값을 반환합니다. 이 값은 해당 구간에서 임의로 또는 의사 임의적으로 대략적으로 균일한 분포로 선택되며, 구현
정의 알고리즘이나 전략을 사용합니다.
서로 다른 realm 에 대해 생성된 각
Math.random 함수는 연속 호출 시 서로 다른 값의 시퀀스를 생성해야 합니다.
21.3.2.29 Math.round ( x )
이 함수는 x 에 가장 가까운 정수 Number 값을 반환합니다. 두 정수 Number 가 x 에 동일하게
가까우면, 결과는 +∞에 더 가까운 Number 값입니다. x 가 이미 정수라면 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 정수 Number 이면,
n 을 반환한다.
n < 0.5 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n < -0 𝔽 이고 n ≥
-0.5 𝔽 이면, -0 𝔽 을 반환한다.
n 에 가장 가까운 정수 Number 를 반환하는데, 동점일 경우 +∞에 더 가까운 값을
반환한다.
참고 1
Math.round(3.5)는 4를 반환하지만 Math.round(-3.5)는 -3을 반환합니다.
참고 2
Math.round(x)의 값은 항상 Math.floor(x + 0.5)의 값과 같지 않습니다.
x가 -0 𝔽 이거나 x가
-0 𝔽 보다 작고 -0.5 𝔽 이상이면,
Math.round(x)는 -0 𝔽 을 반환하지만
Math.floor(x + 0.5)는 +0 𝔽 을 반환합니다.
Math.round(x)는 Math.floor(x + 0.5)와 내부적으로 x + 0.5를 계산할 때의
반올림 차이로 인해 값이 다를 수도 있습니다.
21.3.2.30 Math.sign ( x )
이 함수는 x 의 부호를 반환하며, x 가 양수, 음수 또는 0인지 나타냅니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n < -0 𝔽 이면,
-1 𝔽 을 반환한다.
1 𝔽 을 반환한다.
21.3.2.31 Math.sin ( x )
이 함수는 x 의 사인 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의 사인임.
21.3.2.32 Math.sinh ( x )
이 함수는 x 의 쌍곡사인 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡사인임.
참고
Math.sinh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / 2의 값과 같습니다.
21.3.2.33 Math.sqrt ( x )
이 함수는 x 의 제곱근 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 , +∞ 𝔽 중 하나이면,
n 을 반환한다.
n < -0 𝔽 이면, NaN 을
반환한다.
𝔽 (n 의
제곱근, ℝ (n ))를 반환한다.
21.3.2.34 Math.tan ( x )
이 함수는 x 의 탄젠트 값을 반환합니다. 인자는 라디안 단위입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 또는
-∞ 𝔽 이면, NaN 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
탄젠트임.
21.3.2.35 Math.tanh ( x )
이 함수는 x 의 쌍곡탄젠트 값을 반환합니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 NaN , +0 𝔽 ,
-0 𝔽 중 하나이면, n 을 반환한다.
n 이 +∞ 𝔽 이면,
1 𝔽 을 반환한다.
n 이 -∞ 𝔽 이면,
-1 𝔽 을 반환한다.
구현 근삿값 Number 값을 반환하는데,
ℝ (n )의
쌍곡탄젠트임.
참고
Math.tanh(x)의 값은
(Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))의 값과 같습니다.
21.3.2.36 Math.trunc ( x )
이 함수는 숫자 x 의 소수 부분을 제거하고 정수 부분만 반환합니다. x 가 이미 정수라면 결과는 x 입니다.
호출 시 다음 단계를 수행합니다:
n 에 ? ToNumber (x )를 할당한다.
n 이 유한
값 이 아니거나 n 이 +0 𝔽 또는
-0 𝔽 이면, n 을 반환한다.
n < 1 𝔽 이고 n >
+0 𝔽 이면, +0 𝔽 을 반환한다.
n < -0 𝔽 이고 n >
-1 𝔽 이면, -0 𝔽 을 반환한다.
n 에 가장 가까운 정수 Number 를 +0𝔽 방향으로 반환한다.
21.4 Date 객체
21.4.1 Date 객체 개요와 추상 연산 정의
다음 추상 연산 들은 시간 값 에 대해 동작합니다(21.4.1.1 에서 정의됨). 이 함수들에 전달되는 인수 중
하나라도 NaN 이면, 결과도 NaN 이 됨을 유의하세요.
21.4.1.1 시간 값과 시간 범위
ECMAScript의 시간 측정은 POSIX의 시간 측정과 유사하며, 역 그레고리력(proleptic Gregorian calendar), 1970년 1월 1일
자정(UTC)이라는 기점(epoch) , 그리고 모든 날이 정확히 86,400초(각각 1000밀리초)로
구성된다는 정의를 공유합니다.
ECMAScript 시간 값 은 Number 타입이며, 밀리초
단위로 시간을 나타내는 유한
정수
Number 이거나, 특정 순간을 나타내지 않음은 NaN 으로 나타냄. 24 × 60 × 60
× 1000 = 86,400,000의 배수(즉, 86,400,000 × d 형태, 정수 d 에 대해)는 기점 이후 d 일째 UTC의
시작 순간을 나타냅니다(음수 d 는 기점 이전). 그 외의 유한 시간 값 t 는 가장 가까운 앞선 배수 s 를 기준으로,
그 날의 시작 순간에서 (t - s ) 밀리초 후를 나타냅니다.
시간 값은 UTC 윤초(leap second)를 고려하지 않습니다—양의 윤초 구간의 순간을 나타내는 시간 값은 없고, 음의 윤초로 인해 제거된 순간을 나타내는 값은
존재합니다. 하지만 시간 값의 정의는 윤초 경계에서만 불연속이 있으며, 그 외에는 UTC와 일치합니다.
Number 타입은 -9,007,199,254,740,992에서 9,007,199,254,740,992(21.1.2.8 , 21.1.2.6 )까지의 모든 정수 를 정확히 나타낼 수 있습니다.
하지만 시간 값의 범위는 -8,640,000,000,000,000에서 8,640,000,000,000,000 밀리초까지로, 1970년 1월 1일 자정 기준으로 정확히
-100,000,000일부터 +100,000,000일까지의 범위를 지원합니다.
1970년 1월 1일 자정(UTC) 순간은 +0 𝔽 시간 값으로 나타냅니다.
참고
역 그레고리력에서 윤년은 4로 나누어지고, 400으로 나누어지거나 100으로 나누어지지 않는 해입니다.
400년 주기에는 윤년이 97번 있습니다. 평균적으로 1년에 365.2425일, 즉 31,556,952,000밀리초가 됩니다. Number 타입이 밀리초
단위로 정확히 나타낼 수 있는 최대 범위는 1970년 기준 대략 -285,426년에서 +285,426년입니다. 이 섹션에서 규정한 시간 값의 범위는 약
-273,790년에서 +273,790년입니다.
21.4.1.2 시간 관련 상수
이 상수들은 이후 섹션의 알고리즘에서 참조됩니다.
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000 𝔽
21.4.1.3 Day ( t )
Day 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다. t 가 속한 날의 day number를 반환합니다. 호출 시 다음 단계를
수행합니다:
𝔽 (floor (ℝ (t / msPerDay )))를 반환한다.
21.4.1.4 TimeWithinDay ( t )
TimeWithinDay 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환하며, +0𝔽 (포함)에서 msPerDay (제외)까지의 구간 내에
있습니다. t 가 속한 날의 시작 순간부터 경과한 밀리초를 반환합니다. 호출 시 다음 단계를 수행합니다:
𝔽 (ℝ (t ) modulo
ℝ (msPerDay )))를 반환한다.
21.4.1.5 DaysInYear ( y )
DaysInYear 추상 연산은 y (정수 Number )를 인수로 받아
365 𝔽 또는 366 𝔽 을 반환합니다.
y 년의 날 수를 반환하며, 윤년은 366일, 그 외는 365일입니다. 호출 시 다음 단계를 수행합니다:
ry 에 ℝ (y )를 할당한다.
(ry modulo 400) = 0이면,
366 𝔽 을 반환한다.
(ry modulo 100) = 0이면,
365 𝔽 을 반환한다.
(ry modulo 4) = 0이면,
366 𝔽 을 반환한다.
365 𝔽 을 반환한다.
21.4.1.6 DayFromYear ( y )
DayFromYear 추상 연산은 y (정수 Number )를 인수로 받아 정수
Number 를 반환합니다. y 년의 첫날의 day number를 반환합니다. 호출 시 다음 단계를
수행합니다:
ry 에 ℝ (y )를 할당한다.
NOTE: 아래 단계에서
numYears1 , numYears4 , numYears100 ,
numYears400 은 기점 부터 y 년 시작까지 1, 4, 100, 400으로 나누어
떨어지는 해의 수를 나타냅니다. y 가 기점 이전이라면 음수입니다.
numYears1 에 (ry - 1970)를 할당한다.
numYears4 에 floor ((ry - 1969) / 4)를 할당한다.
numYears100 에 floor ((ry - 1901) / 100)를 할당한다.
numYears400 에 floor ((ry - 1601) / 400)를 할당한다.
𝔽 (365 ×
numYears1 + numYears4 - numYears100 +
numYears400 )를 반환한다.
21.4.1.7 TimeFromYear ( y )
TimeFromYear 추상 연산은 y (정수 Number )를 인수로 받아 시간 값 을 반환합니다. y 년 시작
순간의 시간 값 을 반환합니다. 호출 시 다음 단계를
수행합니다:
msPerDay × DayFromYear (y )를 반환한다.
21.4.1.8 YearFromTime ( t )
YearFromTime 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다. t 가 속한 해를 반환합니다. 호출 시 다음 단계를 수행합니다:
+∞에 가장 가까운 정수 Number y 중 TimeFromYear (y ) ≤
t 인 값 중 가장 큰 값을 반환한다.
21.4.1.9 DayWithinYear ( t )
DayWithinYear 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환하며, +0𝔽 에서 365𝔽 까지의 구간
내에 있습니다. 호출 시 다음 단계를 수행합니다:
Day (t ) - DayFromYear (YearFromTime (t ))를 반환한다.
21.4.1.10 InLeapYear ( t )
InLeapYear 추상 연산은 t (유한 시간 값 )을 인수로 받아
+0 𝔽 또는 1 𝔽 을 반환합니다.
t 가 윤년 내에 있으면 1 𝔽 , 아니면
+0 𝔽 을 반환합니다. 호출 시 다음 단계를 수행합니다:
DaysInYear (YearFromTime (t ))이
366 𝔽 이면, 1 𝔽 을 반환하고, 아니면
+0 𝔽 을 반환한다.
21.4.1.11 MonthFromTime ( t )
MonthFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
11 𝔽 까지이다.
t 가 속한 월을 나타내는 Number를 반환한다.
+0 𝔽 은 1월, 1 𝔽 은 2월,
2 𝔽 은 3월,
3 𝔽 은 4월, 4 𝔽 은 5월,
5 𝔽 은 6월,
6 𝔽 은 7월, 7 𝔽 은 8월,
8 𝔽 은 9월,
9 𝔽 은 10월, 10 𝔽 은 11월,
11 𝔽 은 12월을 의미한다.
MonthFromTime(+0 𝔽 ) =
+0 𝔽 이며, 이는 1970년 1월 1일 목요일을 의미한다.
다음 단계로 동작한다:
inLeapYear 에 InLeapYear (t )를 할당한다.
dayWithinYear 에 DayWithinYear (t )를 할당한다.
dayWithinYear < 31 𝔽 이면
+0 𝔽 을 반환한다.
dayWithinYear < 59 𝔽 +
inLeapYear 이면 1 𝔽 을 반환한다.
dayWithinYear < 90 𝔽 +
inLeapYear 이면 2 𝔽 을 반환한다.
dayWithinYear < 120 𝔽 +
inLeapYear 이면 3 𝔽 을 반환한다.
dayWithinYear < 151 𝔽 +
inLeapYear 이면 4 𝔽 을 반환한다.
dayWithinYear < 181 𝔽 +
inLeapYear 이면 5 𝔽 을 반환한다.
dayWithinYear < 212 𝔽 +
inLeapYear 이면 6 𝔽 을 반환한다.
dayWithinYear < 243 𝔽 +
inLeapYear 이면 7 𝔽 을 반환한다.
dayWithinYear < 273 𝔽 +
inLeapYear 이면 8 𝔽 을 반환한다.
dayWithinYear < 304 𝔽 +
inLeapYear 이면 9 𝔽 을 반환한다.
dayWithinYear < 334 𝔽 +
inLeapYear 이면 10 𝔽 을 반환한다.
Assert :
dayWithinYear < 365 𝔽 +
inLeapYear 이다.
11 𝔽 을 반환한다.
21.4.1.12 DateFromTime ( t )
DateFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 1 𝔽 부터
31 𝔽 까지이다.
t 가 속한 월의 날짜(일)을 반환한다.
다음 단계로 동작한다:
inLeapYear 에 InLeapYear (t )를 할당한다.
dayWithinYear 에 DayWithinYear (t )를 할당한다.
month 에 MonthFromTime (t )를 할당한다.
month 가 +0 𝔽 이면 dayWithinYear +
1 𝔽 을 반환한다.
month 가 1 𝔽 이면 dayWithinYear -
30 𝔽 을 반환한다.
month 가 2 𝔽 이면 dayWithinYear -
58 𝔽 - inLeapYear 을 반환한다.
month 가 3 𝔽 이면 dayWithinYear -
89 𝔽 - inLeapYear 을 반환한다.
month 가 4 𝔽 이면 dayWithinYear -
119 𝔽 - inLeapYear 을 반환한다.
month 가 5 𝔽 이면 dayWithinYear -
150 𝔽 - inLeapYear 을 반환한다.
month 가 6 𝔽 이면 dayWithinYear -
180 𝔽 - inLeapYear 을 반환한다.
month 가 7 𝔽 이면 dayWithinYear -
211 𝔽 - inLeapYear 을 반환한다.
month 가 8 𝔽 이면 dayWithinYear -
242 𝔽 - inLeapYear 을 반환한다.
month 가 9 𝔽 이면 dayWithinYear -
272 𝔽 - inLeapYear 을 반환한다.
month 가 10 𝔽 이면 dayWithinYear -
303 𝔽 - inLeapYear 을 반환한다.
Assert :
month 는 11 𝔽 임.
dayWithinYear - 333 𝔽 -
inLeapYear 을 반환한다.
21.4.1.13 WeekDay ( t )
WeekDay 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
6 𝔽 까지이다.
t 가 속한 요일을 나타내는 Number를 반환한다.
+0 𝔽 은 일요일, 1 𝔽 은 월요일,
2 𝔽 은 화요일,
3 𝔽 은 수요일, 4 𝔽 은 목요일,
5 𝔽 은 금요일,
6 𝔽 은 토요일을 의미한다.
WeekDay(+0 𝔽 ) =
4 𝔽 이며, 이는 1970년 1월 1일 목요일을 의미한다.
다음 단계로 동작한다:
𝔽 (ℝ (Day (t ) +
4 𝔽 ) modulo 7 )을 반환한다.
21.4.1.14 HourFromTime ( t )
HourFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
23 𝔽 까지이다.
t 가 속한 날의 시(hour)를 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerHour
)
)
modulo
HoursPerDay
)를 반환한다.
21.4.1.15 MinFromTime ( t )
MinFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
59 𝔽 까지이다.
t 가 속한 시(hour)의 분(minute)을 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerMinute
)
)
modulo
MinutesPerHour
)를 반환한다.
21.4.1.16 SecFromTime ( t )
SecFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
59 𝔽 까지이다.
t 가 속한 분(minute)의 초(second)를 반환한다. 다음 단계로 동작한다:
𝔽 (
floor (
ℝ (
t / msPerSecond
)
)
modulo
SecondsPerMinute
)를 반환한다.
21.4.1.17 msFromTime ( t )
msFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고,
정수
Number 를 반환하는데,
포함
구간 +0 𝔽 부터
999 𝔽 까지이다.
t 가 속한 초(second)의 밀리초(millisecond)를 반환한다. 다음 단계로 동작한다:
𝔽 (
ℝ (t )
modulo
ℝ (
msPerSecond
)
)를 반환한다.
21.4.1.18 GetUTCEpochNanoseconds ( year ,
month , day , hour , minute , second ,
millisecond , microsecond , nanosecond )
GetUTCEpochNanoseconds 추상 연산은 year ( 정수 ),
month ( 정수 , 포함 구간 1~12 ),
day ( 정수 , 포함 구간 1~31 ),
hour ( 정수 , 포함 구간 0~23 ),
minute ( 정수 , 포함 구간 0~59 ),
second ( 정수 , 포함 구간 0~59 ),
millisecond ( 정수 , 포함 구간 0~999 ),
microsecond ( 정수 , 포함 구간 0~999 ),
nanosecond ( 정수 , 포함 구간 0~999 )를 인수로 받고,
BigInt를 반환한다. 반환된 값은 기점 이후의 나노초 수로, 주어진 ISO 8601 달력 날짜 및 UTC 벽시각에 해당한다. 다음
단계로 동작한다:
date 에
MakeDay (
𝔽 (year ),
𝔽 (month
- 1),
𝔽 (day )
)를 할당한다.
time 에
MakeTime (
𝔽 (hour ),
𝔽 (minute ),
𝔽 (second ),
𝔽 (millisecond )
)를 할당한다.
ms 에
MakeDate (
date , time
)를 할당한다.
Assert :
ms 는 정수 Number 임을 보장한다.
ℤ (
ℝ (ms ) ×
106
+ microsecond × 103
+ nanosecond
)를 반환한다.
21.4.1.19 타임존 식별자
ECMAScript에서 타임존은 타임존 식별자 로 표현되며, 이는
0x0000 ~ 0x007F의 포함 구간 내 코드 유닛으로만 이루어진 문자열입니다.
ECMAScript 구현에서 지원하는 타임존은 사용 가능한 이름이
있는 타임존 일 수 있으며,
이는 타임존 식별자 레코드 의 [[Identifier]] 필드를 통해 표현되며,
AvailableNamedTimeZoneIdentifiers 에서
반환됩니다.
또는 오프셋 타임존 일 수 있으며,
이는 IsTimeZoneOffsetString 이
true 를 반환하는 문자열입니다.
기본 타임존 식별자 는 사용 가능한 이름이 있는
타임존의 대표 식별자입니다.
비기본 타임존 식별자 는 기본 타임존
식별자가 아닌 사용 가능한 이름이 있는 타임존의 식별자입니다.
사용 가능한 이름이 있는 타임존
식별자 는 기본 또는 비기본 타임존 식별자 중 하나입니다.
각각의 사용 가능한 이름이 있는 타임존 식별자는 정확히 하나의 사용 가능한 이름이 있는 타임존에 연결됩니다.
각각의 사용 가능한 이름이 있는 타임존은 정확히 하나의 기본 타임존 식별자와 0개 이상의 비기본 타임존 식별자에 연결됩니다.
ECMAScript 구현은 "UTC" 식별자를 가진 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며,
이는 UTC 타임존의 기본 타임존 식별자여야 합니다.
그 외에도 임의의 수의 사용 가능한 이름이 있는 타임존을 지원할 수 있습니다.
ECMA-402 국제화 API 명세의 타임존 요구사항을 따르는 구현은 타임존 인식 구현 이라 하며,
타임존 인식 구현은 IANA Time Zone Database의 Zone과 Link 이름에 해당하는 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며, 오직 그
이름만 사용할 수 있습니다.
이러한 구현에서 기본 타임존 식별자는 Zone 이름이고, 비기본 식별자는 Link 이름입니다. 단, ECMA-402 명세의 AvailableNamedTimeZoneIdentifiers 에
의해 명시적으로 오버라이드된 경우는 예외입니다.
전체 IANA Time Zone Database를 지원하지 않는 구현도 타임존 식별자로 IANA Time Zone Database 이름을 사용하는 것이 권장됩니다.
21.4.1.20 GetNamedTimeZoneEpochNanoseconds (
timeZoneIdentifier , year , month , day ,
hour , minute , second , millisecond ,
microsecond , nanosecond )
구현
정의 추상 연산 GetNamedTimeZoneEpochNanoseconds는
timeZoneIdentifier (문자열), year (정수 ), month (정수 , 포함
구간 1~12), day (정수 , 포함 구간 1~31),
hour (정수 , 포함 구간 0~23),
minute (정수 , 포함 구간 0~59),
second (정수 , 포함 구간 0~59),
millisecond (정수 , 포함 구간 0~999),
microsecond (정수 , 포함 구간 0~999),
nanosecond (정수 , 포함 구간 0~999)를 인수로 받아
BigInt 리스트 를 반환합니다.
반환된 리스트의 각 값은 timeZoneIdentifier 로 지정된 이름이 있는 타임존에서 지정된 ISO 8601 달력 날짜 및 벽시각에 해당하는
기점 이후의 나노초 수를 나타냅니다.
입력이 음수 시간대 전환(예: 서머타임 해제 또는 시간대 규칙 변경으로 오프셋 감소)으로 인해 지역 시간이 두 번 발생하는 경우,
반환되는 리스트 는 2개 이상의 요소를 가지며
오름차순으로 정렬됩니다.
입력이 양수 시간대 전환(예: 서머타임 시작 또는 시간대 규칙 변경으로 오프셋 증가)으로 인해 지역 시간이 건너뛰어진 경우,
반환되는 리스트 는 비어 있습니다.
그 외에는 반환되는 리스트 는 하나의 요소만을 가집니다.
로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneEpochNanoseconds의 기본 구현은 다음 단계를 따릅니다:
Assert :
timeZoneIdentifier 가 "UTC" 임을 보장합니다.
epochNanoseconds 에 GetUTCEpochNanoseconds (year ,
month , day , hour , minute ,
second , millisecond , microsecond ,
nanosecond )를 할당합니다.
« epochNanoseconds »를 반환합니다.
참고
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복되므로,
GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 11, 5,
1, 30, 0, 0, 0, 0)는 길이가 2인 리스트 를 반환하며,
첫 번째 요소는 05:30 UTC(UTC 오프셋 -04:00인 미국 동부 서머타임 01:30에 해당)이고, 두 번째 요소는 06:30 UTC(UTC
오프셋 -05:00인 미국 동부 표준시 01:30에 해당)입니다.
2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않으므로,
GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 3, 12,
2, 30, 0, 0, 0, 0)는 빈 리스트 를 반환합니다.
21.4.1.21 GetNamedTimeZoneOffsetNanoseconds (
timeZoneIdentifier , epochNanoseconds )
구현
정의 추상 연산 GetNamedTimeZoneOffsetNanoseconds는
timeZoneIdentifier (문자열)와 epochNanoseconds (BigInt)를 인수로 받아 정수 를 반환합니다.
반환된 정수 는
timeZoneIdentifier 로 지정된 이름이 있는 타임존의 epochNanoseconds (기점 기준)에서의 UTC로부터의
오프셋(나노초 단위)을 나타냅니다.
로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneOffsetNanoseconds의 기본 구현은 다음 단계를 따릅니다:
Assert :
timeZoneIdentifier 가 "UTC" 임을 보장합니다.
0을 반환합니다.
참고
타임존 오프셋 값은 양수 또는 음수일 수 있습니다.
21.4.1.22 타임존 식별자 레코드
타임존 식별자 레코드 는 레코드 로, 사용 가능한 이름이 있는 타임존 식별자 와 해당 기본 타임존 식별자 를 설명하는 데 사용됩니다.
타임존 식별자 레코드는 표 64 에 나열된 필드를 가집니다.
표 64: 타임존 식별자 레코드 필드
참고
[[Identifier]] 가 기본 타임존 식별자 인
경우, [[Identifier]] 는 [[PrimaryIdentifier]] 와 동일합니다.
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
구현
정의 추상 연산 AvailableNamedTimeZoneIdentifiers는 인수 없이 호출되며 타임존 식별자 레코드 리스트 를
반환합니다.
결과는 해당 구현에서 모든 사용 가능한 이름이 있는 타임존 식별자 와,
각 기본 타임존 식별자 의 정보를 설명합니다.
리스트 는 각 타임존 식별자 레코드 의 [[Identifier]] 필드 기준으로 정렬됩니다.
타임존 인식 구현 (ECMA-402 국제화 API 구현 포함)는
ECMA-402 명세에서 규정한 대로 AvailableNamedTimeZoneIdentifiers 추상 연산을 반드시 구현해야 합니다.
타임존 인식 구현 가 아닌 경우
AvailableNamedTimeZoneIdentifiers는 다음 단계를 수행합니다:
구현이 어떤 타임존에 대해서도 로컬 정치적 규칙을 포함하지 않는 경우,
« 타임존 식별자 레코드
{ [[Identifier]] : "UTC" , [[PrimaryIdentifier]] : "UTC" } »를
반환한다.
identifiers 에 리스트 로, 고유한
사용 가능한 이름이 있는 타임존 식별자 를
사전식 코드 유닛 순서 대로 정렬하여
할당한다.
result 에 새로운 빈 리스트 를 할당한다.
identifiers 의 각 identifier 에 대해,
primary 에 identifier 를 할당한다.
identifier 가 해당 구현에서 비기본 타임존
식별자 이고 "UTC" 가 아니라면,
primary 에 identifier 와 연결된 기본 타임존 식별자 를
할당한다.
NOTE: 구현에 따라 primary 를 얻을 때 identifier 를 반복적으로
해석해야 할 수도 있음.
record 에 타임존 식별자
레코드
{ [[Identifier]] : identifier , [[PrimaryIdentifier]] : primary }를 할당한다.
record 를 result 에 추가한다.
Assert :
result 는 타임존 식별자
레코드 r 를 포함하며, r .[[Identifier]] 가 "UTC" 이고 r .[[PrimaryIdentifier]] 도 "UTC" 임.
result 를 반환한다.
21.4.1.24 SystemTimeZoneIdentifier ( )
구현
정의 추상 연산 SystemTimeZoneIdentifier는 인수 없이 호출되며 문자열을 반환합니다.
반환값은 호스트
환경 의 현재 타임존을 나타내는 문자열로,
IsTimeZoneOffsetString 이
true 를 반환하는 UTC 오프셋 문자열이거나, 기본 타임존 식별자 일 수 있습니다.
다음 단계를 수행합니다:
구현이 UTC 타임존만 지원한다면 "UTC" 를 반환한다.
systemTimeZoneString 에 호스트 환경 의 현재 타임존을 나타내는
문자열을 할당하는데, 기본 타임존 식별자 또는 오프셋 타임존 식별자임.
systemTimeZoneString 을 반환한다.
참고
Date 객체의 일반적인 기능 수준을 보장하기 위해, SystemTimeZoneIdentifier는 호스트 환경의 타임존 설정에 해당하는 IANA
타임존 이름을 반환하는 것이 권장됩니다(존재한다면).
GetNamedTimeZoneEpochNanoseconds
및 GetNamedTimeZoneOffsetNanoseconds
는 해당 타임존의 표준시 및 서머타임에 관한 로컬 정치적 규칙을 반영해야 합니다(규칙이 존재한다면).
예를 들어, 호스트 환경 이 미국 동부 시간이 선택된 시스템의 브라우저라면,
SystemTimeZoneIdentifier는 "America/New_York" 을 반환합니다.
21.4.1.25 LocalTime ( t )
LocalTime 추상 연산은 t (유한 시간 값 )을 인수로 받아
정수
Number 를 반환합니다.
t 를 UTC에서 로컬 시간으로 변환합니다.
t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정한 방식으로 적용해 결과를 산출합니다.
다음 단계를 수행합니다:
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )가
true 라면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
ℤ (ℝ (t ) ×
106 ))를 할당한다.
offsetMs 에 truncate (offsetNs /
106 )를 할당한다.
t + 𝔽 (offsetMs )를 반환한다.
참고 1
구현 내에 t 의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t 입니다. 이는 SystemTimeZoneIdentifier 가
"UTC" 를 반환하고 GetNamedTimeZoneOffsetNanoseconds 가
0을 반환하기 때문입니다.
참고 2
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
참고 3
음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)으로 반복된 시간이 존재할 때, 두 개의 서로 다른 시간 값 t UTC 는 같은 로컬 시간 tlocal 으로 변환됩니다.
LocalTime(UTC (t local )) 는
항상 t local 과 같지는 않을 수 있습니다.
마찬가지로 UTC (LocalTime(t UTC )) 도
항상 t UTC 과 같지는 않을 수 있습니다.
21.4.1.26 UTC ( t )
UTC 추상 연산은 t (Number)를 인수로 받아 시간 값 을 반환합니다.
t 를 로컬 시간에서 UTC 시간 값 으로 변환합니다.
t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정된 방식으로 적용해 결과를 산출해야 합니다.
다음 단계를 수행합니다:
t 가 유한 이 아니면 NaN 을 반환한다.
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )가
true 면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
possibleInstants 에 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier ,
ℝ (YearFromTime (t )),
ℝ (MonthFromTime (t ))
+ 1, ℝ (DateFromTime (t )),
ℝ (HourFromTime (t )),
ℝ (MinFromTime (t )),
ℝ (SecFromTime (t )),
ℝ (msFromTime (t )), 0,
0).
NOTE: 다음 단계들은 t 가 음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)에서 반복되는 로컬 시간을
나타내거나, 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간일 때 t 가 전환 전
오프셋으로 해석되도록 보장합니다.
possibleInstants 가 비어 있지 않으면,
disambiguatedInstant 에 possibleInstants [0]을
할당한다.
그 외,
NOTE: t 는 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간을
나타냅니다.
possibleInstantsBefore 에 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier ,
ℝ (YearFromTime (tBefore )),
ℝ (MonthFromTime (tBefore ))
+ 1, ℝ (DateFromTime (tBefore )),
ℝ (HourFromTime (tBefore )),
ℝ (MinFromTime (tBefore )),
ℝ (SecFromTime (tBefore )),
ℝ (msFromTime (tBefore )),
0, 0), 여기서 tBefore 는 t 보다 작은 가장 큰 정수 Number 로,
possibleInstantsBefore 가 비어있지 않은 값(즉, tBefore 는
전환 이전 마지막 로컬 시간을 나타냄).
disambiguatedInstant 에 possibleInstantsBefore 의
마지막 요소를 할당한다.
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
disambiguatedInstant )를 할당한다.
offsetMs 에 truncate (offsetNs /
106 )를 할당한다.
t - 𝔽 (offsetMs )를 반환한다.
입력 t 는 명목상 시간 값 이지만, 임의의 Number 값일 수 있습니다.
알고리즘은 t 를 시간 값 의 범위로 제한해서는 안 됩니다.
예를 들어, 최대 시간 값 은 8.64 × 1015 로,
"+275760-09-13T00:00:00Z" 에 해당합니다.
만약 로컬 타임존 오프셋이 그 시점에 UTC보다 1시간 빠르다면, 8.64 × 1015 + 3.6 × 106 입력은
"+275760-09-13T01:00:00+01:00" 에 해당합니다.
구현 내에 t 의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t 입니다. 이는 SystemTimeZoneIdentifier 가
"UTC" 를 반환하고 GetNamedTimeZoneOffsetNanoseconds 가
0을 반환하기 때문입니다.
참고 1
타임존 인식 구현 에서는 반드시(그 외에도 권장됨)
IANA Time Zone Database (https://www.iana.org/time-zones/ )의
타임존 정보를 사용해야 합니다.
2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복(가을 뒤로 이동)이지만, 반드시 1:30 AM UTC-04로
해석되어야 하며 1:30 AM UTC-05가 아님.
UTC(TimeClip (MakeDate (MakeDay (2017, 10, 5), MakeTime (1, 30, 0, 0))))에서
offsetMs 값은 -4 × msPerHour 입니다.
2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않지만, 반드시 2:30 AM UTC-05(= 3:30 AM
UTC-04)로 해석되어야 합니다.
UTC(TimeClip (MakeDate (MakeDay (2017, 2, 12), MakeTime (2, 30, 0, 0))))에서
offsetMs 값은 -5 × msPerHour 입니다.
참고 2
UTC(LocalTime (t UTC )) 는
항상 t UTC 과 같지는 않습니다. 마찬가지로
LocalTime (UTC(t local )) 도
항상 t local 과 같지는 않습니다.
21.4.1.27 MakeTime ( hour , min ,
sec , ms )
MakeTime 추상 연산은 hour (Number), min (Number), sec (Number),
ms (Number)를 인수로 받아 Number를 반환합니다. 밀리초 수를 계산합니다. 다음 단계를 수행합니다:
hour 가 유한 이 아니거나, min 이 유한 이 아니거나,
sec 이 유한 이 아니거나, ms 가 유한 이 아니면
NaN 을 반환한다.
h 에 𝔽 (!
ToIntegerOrInfinity (hour ))를
할당한다.
m 에 𝔽 (!
ToIntegerOrInfinity (min ))를
할당한다.
s 에 𝔽 (!
ToIntegerOrInfinity (sec ))를
할당한다.
milli 에 𝔽 (! ToIntegerOrInfinity (ms ))를
할당한다.
((h × msPerHour + m × msPerMinute ) + s ×
msPerSecond ) + milli 를
반환한다.
참고
MakeTime의 산술 연산은 부동소수점 연산이므로 결합법칙이 성립하지 않으며, 연산은 지정된 순서대로 수행해야 합니다.
21.4.1.28 MakeDay ( year , month ,
date )
MakeDay 추상 연산은 year (Number), month (Number), date (Number)를
인수로 받아 Number를 반환합니다. 일(day) 수를 계산합니다. 호출 시 다음 단계를 수행합니다:
year 가 유한 이 아니거나, month 가 유한 이 아니거나,
date 가 유한 이 아니면 NaN 을 반환한다.
y 에 𝔽 (!
ToIntegerOrInfinity (year ))를
할당한다.
m 에 𝔽 (!
ToIntegerOrInfinity (month ))를
할당한다.
dt 에 𝔽 (!
ToIntegerOrInfinity (date ))를
할당한다.
ym 에 y + 𝔽 (floor (ℝ (m ) / 12))를 할당한다.
ym 이 유한 이 아니면 NaN 을 반환한다.
mn 에 𝔽 (ℝ (m ) modulo 12)를 할당한다.
유한
시간 값 t 를
찾는데,
YearFromTime (t )가
ym 이고,
MonthFromTime (t )가
mn 이고,
DateFromTime (t )가
1 𝔽 일 것.
만약 불가능하다면(인수값이 범위를 벗어나는 경우 등), NaN 을 반환한다.
Day (t ) + dt -
1 𝔽 를 반환한다.
21.4.1.29 MakeDate ( day , time )
MakeDate 추상 연산은 day (Number)와 time (Number)를 인수로 받고 Number를 반환합니다. 밀리초 값을
계산합니다. 호출 시 다음 단계를 수행합니다:
day 가 유한 이 아니거나 time 이 유한 이 아니면
NaN 을 반환한다.
tv 에 day × msPerDay + time 을 할당한다.
tv 가 유한 이 아니면 NaN 을 반환한다.
tv 를 반환한다.
21.4.1.30 MakeFullYear ( year )
MakeFullYear 추상 연산은 year (Number)를 인수로 받아 정수 Number 또는
NaN 을 반환합니다. year 의 정수 부분을 해석하여 해당하는 "full year"를 반환하며, 0~99 구간 값을 1900년
이후의 연도로 해석합니다. 역 그레고리력과의 정렬을 위해 "full year"는 0년(1 B.C.) 이후의 전체 연수(부호 포함)로 정의됩니다. 호출 시 다음 단계를
수행합니다:
year 가 NaN 이면 NaN 을 반환한다.
truncated 에 ! ToIntegerOrInfinity (year )를
할당한다.
truncated 가 0~99의 포함 구간 에 있으면
1900 𝔽 + 𝔽 (truncated )를 반환한다.
𝔽 (truncated )를 반환한다.
21.4.1.31 TimeClip ( time )
TimeClip 추상 연산은 time (Number)를 인수로 받아 Number를 반환합니다. 밀리초 값을 계산합니다. 호출 시 다음 단계를
수행합니다:
time 이 유한 이 아니면 NaN 을 반환한다.
abs (ℝ (time )) >
8.64 × 1015 이면 NaN 을 반환한다.
𝔽 (!
ToIntegerOrInfinity (time ))를
반환한다.
21.4.1.32 날짜-시간 문자열 형식
ECMAScript는 ISO 8601 달력 날짜 확장 형식을 단순화한 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다:
YYYY-MM-DDTHH:mm:ss.sssZ
각 요소의 의미는 다음과 같습니다:
YYYY
역 그레고리력에서 0000~9999 사이의 4자리 연도이거나, 확장 연도 로
"+" 또는 "-" 다음에 6자리 십진수가 옵니다.
-
"-" (하이픈)이 문자열에 두 번 등장합니다.
MM
01(1월)부터 12(12월)까지의 두 자리 십진수 월입니다.
DD
01~31 사이의 두 자리 십진수 날짜(일)입니다.
T
"T" 가 문자열에 그대로 등장하여 시간 요소의 시작을 표시합니다.
HH
자정 이후 경과한 정시(hour)의 수로서, 00~24 사이의 두 자리 십진수입니다.
:
":" (콜론)이 문자열에 두 번 등장합니다.
mm
시(hour) 시작 이후 경과한 분(minute) 수로서, 00~59 사이의 두 자리 십진수입니다.
ss
분(minute) 시작 이후 경과한 초(second) 수로서, 00~59 사이의 두 자리 십진수입니다.
.
"." (점)이 문자열에 그대로 등장합니다.
sss
초(second) 시작 이후 경과한 밀리초(millisecond) 수로서, 3자리 십진수입니다.
Z
UTC 오프셋 표현으로 "Z" (오프셋 없는 UTC) 또는 "+" 또는
"-" 다음에 HH:mm 시간 표현이 옵니다(UTC보다 앞서거나 뒤처진 현지
시간을 나타내는 타임존 오프셋 문자열 형식 의
부분 집합).
이 형식에는 날짜만 나타내는 형태도 포함됩니다:
YYYY
YYYY-MM
YYYY-MM-DD
또한 위의 날짜 형식 바로 뒤에 아래의 시간 형식 중 하나와 선택적 UTC 오프셋 표현이 붙는 “날짜-시간” 형식도 포함됩니다:
THH:mm
THH:mm:ss
THH:mm:ss.sss
범위를 벗어나거나 규격에 맞지 않는 요소가 포함된 문자열은 이 형식의 유효한 인스턴스가 아닙니다.
참고 1
모든 날은 자정에 시작하고 자정에 끝나므로, 날짜 하나에 대해 00:00과 24:00 두 표기를 통해 두
자정을 구분할 수 있습니다. 즉, 1995-02-04T24:00과 1995-02-05T00:00 표기는
정확히 동일한 시점을 나타냅니다. 후자(종료 자정)의 해석은 ISO 8601과 일치하지만, ISO 8601에서는 시간 구간을 설명할 때만 허용하며 단일
시점을 표현할 때는 허용하지 않습니다.
참고 2
CET, EST 등과 같은 시민 시간대 약어에 대한 국제 표준은 존재하지 않으며 같은 약어가 상이한 시간대를 나타내기도 합니다. 이런 이유로 ISO
8601과 이 형식 모두 시간대 오프셋의 숫자 표현만을 명시합니다.
21.4.1.32.1 확장 연도
1월 1일 1970년을 기준으로 약 273,790년 전후의 시간 값 전체 범위를
표현하려면 0년 이전 또는 9999년 이후 연도를 나타낼 수 있어야 합니다(21.4.1.1 참조). ISO 8601은 연도
표기의 확장을 허용하지만, 정보 교환 당사자 간의 합의가 있어야 합니다. ECMAScript 단순화 형식에서는 확장 연도 표기가 6자리이며 항상 + 또는 -
부호가 앞에 옵니다. 0년은 양수로 간주되어 반드시 + 부호가 붙어야 하며, -000000 표기는 유효하지 않습니다. 확장 연도가 날짜-시간 문자열 형식 과 일치하나 시간 값 범위를 벗어나는 시간을 나타내는 경우
Date.parse 에서 인식할 수 없어 해당 함수는
NaN 을 반환하며 구현별 동작이나 휴리스틱으로 대체하지 않습니다.
참고
확장 연도가 포함된 날짜-시간 값 예시:
-271821-04-20T00:00:00Z
271822 B.C.
-000001-01-01T00:00:00Z
2 B.C.
+000000-01-01T00:00:00Z
1 B.C.
+000001-01-01T00:00:00Z
1 A.D.
+001970-01-01T00:00:00Z
1970 A.D.
+002009-12-15T00:00:00Z
2009 A.D.
+275760-09-13T00:00:00Z
275760 A.D.
21.4.1.33 타임존 오프셋 문자열 형식
ECMAScript는 ISO 8601에서 파생된 UTC 오프셋의 문자열 교환 형식을 정의합니다.
형식은 아래의 문법으로 설명합니다.
구문
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign :::
one of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended]
:::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended]
::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
::: one of .
,
21.4.1.33.1 IsTimeZoneOffsetString ( offsetString
)
IsTimeZoneOffsetString 추상 연산은 offsetString (문자열)을 인수로 받아 Boolean을 반환합니다. 반환값은
offsetString 이 UTCOffset 문법에 적합한지 여부를 나타냅니다. 호출 시 다음 단계를
수행합니다:
parseResult 에 ParseText (offsetString ,
UTCOffset )를 할당한다.
parseResult 가 오류
리스트 이면 false 를 반환한다.
true 를 반환한다.
21.4.1.33.2 ParseTimeZoneOffsetString (
offsetString )
ParseTimeZoneOffsetString 추상 연산은 offsetString (문자열)을 인수로 받아 정수 를 반환합니다. 반환값은
offsetString 에 해당하는 UTC 오프셋(나노초 단위)입니다. 호출 시 다음 단계를 수행합니다:
parseResult 에 ParseText (offsetString ,
UTCOffset )를 할당한다.
Assert : parseResult 가 오류 리스트 가
아님을 보장한다.
Assert : parseResult 에 ASCIISign 구문 노드 가 포함되어 있다.
parsedSign 에 매칭된 소스
텍스트 중 ASCIISign 구문 노드 에 해당하는 것을 할당한다.
parsedSign 이 U+002D(HYPHEN-MINUS)이면,
sign 에 -1을 할당한다.
그 외,
sign 에 1을 할당한다.
NOTE: 아래의 StringToNumber 적용 과정에서는, 각 파싱된
값이 충분히 짧은 십진수 문자열이므로 정밀도가 손실되지 않습니다.
Assert : parseResult 에 Hour 구문 노드 가 포함되어 있다.
parsedHours 에 매칭된 소스
텍스트 중 Hour 구문 노드 에 해당하는 것을 할당한다.
hours 에 ℝ (StringToNumber (CodePointsToString (parsedHours )))를
할당한다.
parseResult 에 MinuteSecond 구문 노드 가 포함되어 있지 않으면,
minutes 에 0을 할당한다.
그 외,
parsedMinutes 에 매칭된
소스 텍스트 중 첫 번째 MinuteSecond 구문 노드 에 해당하는 것을
할당한다.
minutes 에 ℝ (StringToNumber (CodePointsToString (parsedMinutes )))를
할당한다.
parseResult 에 두 개의 MinuteSecond 구문 노드 가 포함되어 있지 않으면,
seconds 에 0을 할당한다.
그 외,
parsedSeconds 에 매칭된
소스 텍스트 중 두 번째 MinuteSecond 구문 노드 에 해당하는 것을
할당한다.
seconds 에 ℝ (StringToNumber (CodePointsToString (parsedSeconds )))를
할당한다.
parseResult 에 TemporalDecimalFraction
구문 노드 가 포함되어 있지 않으면,
nanoseconds 에 0을 할당한다.
그 외,
parsedFraction 에 매칭된
소스 텍스트 중 TemporalDecimalFraction
구문 노드 에 해당하는 것을
할당한다.
fraction 에 문자열
연결 결과 CodePointsToString (parsedFraction )과
"000000000" 을 할당한다.
nanosecondsString 에 부분 문자열
fraction 의 1~10번째를 할당한다.
nanoseconds 에 ℝ (StringToNumber (nanosecondsString ))를
할당한다.
sign × (((hours × 60 + minutes ) × 60 +
seconds ) × 109 + nanoseconds )를 반환한다.
21.4.2 Date 생성자
Date 생성자 :
%Date% 이다.
"Date" 프로퍼티의 초기값이며, 글로벌 객체 에 존재한다.
생성자 로 호출
시 새로운 Date를 생성 및 초기화한다.
생성자 가 아닌
함수로 호출 시, 현재 시간(UTC)을 나타내는 문자열을 반환한다.
인수의 개수와 타입에 따라 동작이 달라지는 함수이다.
클래스 정의의 extends 절 값으로 사용될 수 있다. Date의 동작을 상속하려는 서브클래스 생성자 는 [[DateValue]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Date 생성자 에 대한
super 호출을 포함해야 한다.
21.4.2.1 Date ( ...values )
이 함수는 호출 시 다음 단계를 수행한다:
NewTarget이 undefined 이면,
now 에 현재 시간을 나타내는 시간
값 (UTC)를 할당한다.
ToDateString (now )를
반환한다.
numberOfArgs 에 values 의 요소 개수를 할당한다.
numberOfArgs = 0이면,
dv 에 현재 시간을 나타내는 시간
값 (UTC)를 할당한다.
numberOfArgs = 1이면,
value 에 values [0]을 할당한다.
value 가 객체 이고 value 에 [[DateValue]] 내부 슬롯이 있으면,
tv 에 value .[[DateValue]] 를 할당한다.
그 외,
v 에 ? ToPrimitive (value )를
할당한다.
v 가 문자열 이면,
Assert : 다음 단계는
v 가 문자열이므로 비정상
종료 를 반환하지 않는다.
tv 에 v 를 날짜로 파싱한 결과를 할당하는데,
parse 메서드와 정확히 동일한 방식으로 파싱한다 (21.4.3.2 참조).
그 외,
tv 에 ? ToNumber (v )를
할당한다.
dv 에 TimeClip (tv )를 할당한다.
그 외,
Assert : numberOfArgs ≥ 2임을
보장한다.
y 에 ? ToNumber (values [0])를
할당한다.
m 에 ? ToNumber (values [1])를
할당한다.
numberOfArgs > 2이면 dt 에 ? ToNumber (values [2])를
할당하고, 아니면 dt 에 1 𝔽 을 할당한다.
numberOfArgs > 3이면 h 에 ? ToNumber (values [3])를
할당하고, 아니면 h 에 +0 𝔽 을 할당한다.
numberOfArgs > 4이면 min 에 ? ToNumber (values [4])를
할당하고, 아니면 min 에 +0 𝔽 을 할당한다.
numberOfArgs > 5이면 s 에 ? ToNumber (values [5])를
할당하고, 아니면 s 에 +0 𝔽 을 할당한다.
numberOfArgs > 6이면 milli 에 ? ToNumber (values [6])를
할당하고, 아니면 milli 에 +0 𝔽 을 할당한다.
yr 에 MakeFullYear (y )를
할당한다.
finalDate 에 MakeDate (MakeDay (yr ,
m , dt ), MakeTime (h ,
min , s , milli ))를 할당한다.
dv 에 TimeClip (UTC (finalDate ))를 할당한다.
O 에 ? OrdinaryCreateFromConstructor (NewTarget,
"%Date.prototype%" , « [[DateValue]] »)
을 할당한다.
O .[[DateValue]] 에 dv 를 설정한다.
O 를 반환한다.
21.4.3 Date 생성자의 속성
Date 생성자 :
21.4.3.1 Date.now ( )
이 함수는 호출 시점의 UTC 날짜 및 시간을 나타내는 시간 값 을 반환한다.
21.4.3.2 Date.parse ( string )
이 함수는 인수에 ToString 연산자를 적용한다. ToString 결과가 비정상 종료 면 Completion Record 를
즉시 반환한다. 그렇지 않으면, 결과 문자열을 날짜와 시간으로 해석한다. 반환값은 해당 날짜 및 시간에 대응하는 UTC 시간 값 인 Number이다. 문자열은 내용에 따라 현지
시간, UTC 시간, 또는 다른 타임존의 시간으로 해석될 수 있다. 함수는 먼저 Date Time String Format (21.4.1.32 ) 및 확장 연도에 따라 문자열을 파싱하려
시도한다. 해당 형식에 맞지 않으면 구현별 휴리스틱이나 구현별 날짜 형식으로 대체할 수 있다. 인식 불가하거나 범위 초과 형식 요소가 포함된 문자열은
NaN 을 반환해야 한다.
문자열이 Date Time String Format 에 적합하면,
누락된 형식 요소는 대체 값으로 채워진다. MM 또는 DD 요소가 없으면 "01" 이
사용된다. HH, mm, ss 요소가 없으면 "00" 이
사용된다. sss 요소가 없으면 "000" 이 사용된다. UTC 오프셋 표기가 없으면 날짜만 있는 형식은
UTC 시간으로, 날짜-시간 형식은 로컬 시간으로 해석된다.
x가 해당 ECMAScript 구현에서 밀리초 값이 0인 Date라면, 아래 모든 표현식은 (모든 프로퍼티가 초기값일 때) 같은 숫자 값을
반환해야 한다:
x.valueOf ()
Date .parse (x.toString ())
Date .parse (x.toUTCString ())
Date .parse (x.toISOString ())
하지만 아래 표현식은
Date .parse (x.toLocaleString ())
앞선 세 표현식과 같은 Number 값을 반환할 필요가 없으며, 일반적으로 이 함수가 Date Time String Format (21.4.1.32 )에 맞지 않는 문자열 또는 해당 구현에서
toString이나 toUTCString 메서드로 생성할 수 없는 문자열을 받는 경우 반환값은 구현
정의 이다.
21.4.3.3 Date.prototype
Date.prototype의 초기값은 Date 프로토타입 객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
21.4.3.4 Date.UTC ( year [ , month [ ,
date [ , hours [ , minutes [ , seconds [ ,
ms ] ] ] ] ] ] )
이 함수는 호출 시 다음 단계를 수행한다:
y 에 ? ToNumber (year )를 할당한다.
month 가 있으면 m 에 ? ToNumber (month )를, 없으면
m 에 +0 𝔽 을 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를, 없으면
dt 에 1 𝔽 을 할당한다.
hours 가 있으면 h 에 ? ToNumber (hours )를, 없으면
h 에 +0 𝔽 을 할당한다.
minutes 가 있으면 min 에 ? ToNumber (minutes )를, 없으면
min 에 +0 𝔽 을 할당한다.
seconds 가 있으면 s 에 ? ToNumber (seconds )를, 없으면
s 에 +0 𝔽 을 할당한다.
ms 가 있으면 milli 에 ? ToNumber (ms )를, 없으면
milli 에 +0 𝔽 을 할당한다.
yr 에 MakeFullYear (y )를 할당한다.
TimeClip (MakeDate (MakeDay (yr , m ,
dt ), MakeTime (h , min ,
s , milli )))를 반환한다.
이 함수의 "length" 프로퍼티 값은
7 𝔽 이다.
참고
이 함수는 Date 생성자 와 두 가지가 다르다: Date를 생성하는 대신 Number로
시간 값 을 반환하며, 인수를 로컬 시간
대신 UTC 기준으로 해석한다.
21.4.4 Date 프로토타입 객체의 속성
Date 프로토타입 객체 :
%Date.prototype% 이다.
일반
객체 이다.
Date 인스턴스가 아니며 [[DateValue]] 내부 슬롯을 가지지 않는다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
별도로 명시되지 않는 한, 아래에 정의된 Date 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은 초기화된
시간 값 을 가진 [[DateValue]] 내부 슬롯이 있는 객체여야 한다.
21.4.4.1 Date.prototype.constructor
Date.prototype.constructor의 초기값은 %Date% 이다.
21.4.4.2 Date.prototype.getDate ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
DateFromTime (LocalTime (t ))을 반환한다.
21.4.4.3 Date.prototype.getDay ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
WeekDay (LocalTime (t ))을 반환한다.
21.4.4.4 Date.prototype.getFullYear ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
YearFromTime (LocalTime (t ))을 반환한다.
21.4.4.5 Date.prototype.getHours ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
HourFromTime (LocalTime (t ))을 반환한다.
21.4.4.6 Date.prototype.getMilliseconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
msFromTime (LocalTime (t ))을 반환한다.
21.4.4.7 Date.prototype.getMinutes ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MinFromTime (LocalTime (t ))을 반환한다.
21.4.4.8 Date.prototype.getMonth ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MonthFromTime (LocalTime (t ))을 반환한다.
21.4.4.9 Date.prototype.getSeconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
SecFromTime (LocalTime (t ))을 반환한다.
21.4.4.10 Date.prototype.getTime ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
dateObject .[[DateValue]] 를 반환한다.
21.4.4.11 Date.prototype.getTimezoneOffset ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
(t - LocalTime (t )) / msPerMinute 를 반환한다.
21.4.4.12 Date.prototype.getUTCDate ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
DateFromTime (t )를 반환한다.
21.4.4.13 Date.prototype.getUTCDay ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
WeekDay (t )를 반환한다.
21.4.4.14 Date.prototype.getUTCFullYear ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
YearFromTime (t )를 반환한다.
21.4.4.15 Date.prototype.getUTCHours ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
HourFromTime (t )를 반환한다.
21.4.4.16 Date.prototype.getUTCMilliseconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
msFromTime (t )를 반환한다.
21.4.4.17 Date.prototype.getUTCMinutes ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MinFromTime (t )를 반환한다.
21.4.4.18 Date.prototype.getUTCMonth ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
MonthFromTime (t )를 반환한다.
21.4.4.19 Date.prototype.getUTCSeconds ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
SecFromTime (t )를 반환한다.
21.4.4.20 Date.prototype.setDate ( date )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )를 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
MonthFromTime (t ),
dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
21.4.4.21 Date.prototype.setFullYear ( year [ ,
month [ , date ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
y 에 ? ToNumber (year )를 할당한다.
t 가 NaN 이면 t 에
+0 𝔽 을 할당하고, 아니면 t 에 LocalTime (t )을 할당한다.
month 가 없으면 m 에 MonthFromTime (t )을, 있으면
m 에 ? ToNumber (month )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을, 있으면
dt 에 ? ToNumber (date )을 할당한다.
newDate 에 MakeDate (MakeDay (y ,
m , dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
month 가 없으면 이 메서드는 month 가 getMonth() 값인 것처럼 동작한다.
date 가 없으면 date 가 getDate() 값인 것처럼 동작한다.
21.4.4.22 Date.prototype.setHours ( hour [ ,
min [ , sec [ , ms ] ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
h 에 ? ToNumber (hour )를 할당한다.
min 이 있으면 m 에 ? ToNumber (min )을 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
min 이 없으면 m 에 MinFromTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (h , m ,
s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 4 𝔽 이다.
참고
min 이 없으면 이 메서드는 min 이 getMinutes() 값인 것처럼 동작한다.
sec 이 없으면 sec 이 getSeconds() 값인 것처럼, ms 가
없으면 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.23 Date.prototype.setMilliseconds ( ms )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
ms 에 ? ToNumber (ms )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
time 에 MakeTime (HourFromTime (t ),
MinFromTime (t ), SecFromTime (t ),
ms )를 할당한다.
u 에 TimeClip (UTC (MakeDate (Day (t ),
time )))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
21.4.4.24 Date.prototype.setMinutes ( min [ ,
sec [ , ms ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (min )를 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
m , s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
sec 이 없으면 이 메서드는 sec 이 getSeconds() 값인 것처럼 동작한다.
ms 가 없으면 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.25 Date.prototype.setMonth ( month [ ,
date ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (month )를 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
m , dt ), TimeWithinDay (t ))를 할당한다.
u 에 TimeClip (UTC (newDate ))를
할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
date 가 없으면 이 메서드는 date 가 getDate() 값인 것처럼 동작한다.
21.4.4.26 Date.prototype.setSeconds ( sec [ ,
ms ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
s 에 ? ToNumber (sec )를 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
t 에 LocalTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
MinFromTime (t ),
s , milli ))를 할당한다.
u 에 TimeClip (UTC (date ))를 할당한다.
dateObject .[[DateValue]] 에 u 를 설정한다.
u 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
ms 가 없으면 이 메서드는 ms 가 getMilliseconds() 값인 것처럼 동작한다.
21.4.4.27 Date.prototype.setTime ( time )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 ? ToNumber (time )를 할당한다.
v 에 TimeClip (t )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.28 Date.prototype.setUTCDate ( date )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
MonthFromTime (t ),
dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.29 Date.prototype.setUTCFullYear ( year [ ,
month [ , date ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
t 가 NaN 이면 t 에
+0 𝔽 을 할당한다.
y 에 ? ToNumber (year )를 할당한다.
month 가 없으면 m 에 MonthFromTime (t )을, 있으면
m 에 ? ToNumber (month )을 할당한다.
date 가 없으면 dt 에 DateFromTime (t )을, 있으면
dt 에 ? ToNumber (date )을 할당한다.
newDate 에 MakeDate (MakeDay (y ,
m , dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
month 가 없으면 이 메서드는 month 가 getUTCMonth() 값인 것처럼
동작한다. date 가 없으면 date 가 getUTCDate() 값인 것처럼 동작한다.
21.4.4.30 Date.prototype.setUTCHours ( hour [ ,
min [ , sec [ , ms ] ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
h 에 ? ToNumber (hour )를 할당한다.
min 이 있으면 m 에 ? ToNumber (min )을 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
min 이 없으면 m 에 MinFromTime (t )을 할당한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (h , m ,
s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 4 𝔽 이다.
참고
min 이 없으면 이 메서드는 min 이 getUTCMinutes() 값인 것처럼 동작한다.
sec 이 없으면 sec 이 getUTCSeconds() 값인 것처럼,
ms 가 없으면 ms 가 getUTCMilliseconds() 값인 것처럼 동작한다.
21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
ms 에 ? ToNumber (ms )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
time 에 MakeTime (HourFromTime (t ),
MinFromTime (t ), SecFromTime (t ),
ms )를 할당한다.
v 에 TimeClip (MakeDate (Day (t ),
time ))를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
21.4.4.32 Date.prototype.setUTCMinutes ( min [ ,
sec [ , ms ] ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (min )를 할당한다.
sec 이 있으면 s 에 ? ToNumber (sec )을 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
sec 이 없으면 s 에 SecFromTime (t )을 할당한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
m , s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 3 𝔽 이다.
참고
sec 이 없으면 이 메서드는 sec 이 getUTCSeconds() 값인 것처럼 동작한다.
ms 가 없으면 ms 가 getUTCMilliseconds() 값인 것처럼 동작한다.
21.4.4.33 Date.prototype.setUTCMonth ( month [ ,
date ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
m 에 ? ToNumber (month )를 할당한다.
date 가 있으면 dt 에 ? ToNumber (date )를 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
date 가 없으면 dt 에 DateFromTime (t )을 할당한다.
newDate 에 MakeDate (MakeDay (YearFromTime (t ),
m , dt ), TimeWithinDay (t ))를 할당한다.
v 에 TimeClip (newDate )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
date 가 없으면 이 메서드는 date 가 getUTCDate() 값인 것처럼 동작한다.
21.4.4.34 Date.prototype.setUTCSeconds ( sec [ ,
ms ] )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 에 dateObject .[[DateValue]] 를 할당한다.
s 에 ? ToNumber (sec )를 할당한다.
ms 이 있으면 milli 에 ? ToNumber (ms )을 할당한다.
t 가 NaN 이면 NaN 을 반환한다.
ms 이 없으면 milli 에 msFromTime (t )을 할당한다.
date 에 MakeDate (Day (t ), MakeTime (HourFromTime (t ),
MinFromTime (t ),
s , milli ))를 할당한다.
v 에 TimeClip (date )를 할당한다.
dateObject .[[DateValue]] 에 v 를 설정한다.
v 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 2 𝔽 이다.
참고
ms 가 없으면 이 메서드는 ms 가 getUTCMilliseconds() 값인 것처럼
동작한다.
21.4.4.35 Date.prototype.toDateString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
DateString (t )를 반환한다.
21.4.4.36 Date.prototype.toISOString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 RangeError 예외를 던진다.
Assert :
tv 는 정수 Number 이다.
tv 가 날짜-시간 문자열 형식 에서 표현할 수 없는
연도에 해당하면 RangeError 예외를 던진다.
tv 를 날짜-시간 문자열 형식 의 UTC 시간대로 모든
형식 요소 및 UTC 오프셋 표기 "Z" 을 포함해 문자열로 반환한다.
21.4.4.37 Date.prototype.toJSON ( key )
이 메서드는 JSON.stringify (25.5.2 )에서 사용할 Date의 문자열 표현을 제공합니다.
호출 시 다음 단계를 수행합니다:
O 에 ? ToObject (this 값)을
할당한다.
tv 에 ? ToPrimitive (O ,
number )를 할당한다.
tv 가 Number 이고
tv 가 유한 이 아니면 null 을 반환한다.
? Invoke (O ,
"toISOString" )을 반환한다.
참고 1
참고 2
이 메서드는 의도적으로 generic입니다. this 값이 Date일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있습니다. 하지만 해당 객체에 toISOString 메서드가 있어야 합니다.
21.4.4.38 Date.prototype.toLocaleDateString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date의 "날짜" 부분을 호스트
환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.39 Date.prototype.toLocaleString ( [ reserved1
[ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date를 호스트 환경의 현재 로케일
관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.40 Date.prototype.toLocaleTimeString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의 이지만, 현재 타임존의 Date의 "시간" 부분을 호스트
환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안
됩니다.
21.4.4.41 Date.prototype.toString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
ToDateString (tv )를 반환한다.
참고 1
어떤 Date d에 대해 d.[[DateValue]] 가
1000으로 나누어떨어지면, Date.parse(d.toString()) = d.valueOf()가
성립합니다. 21.4.3.2 참조.
참고 2
이 메서드는 generic이 아니므로 this 값이 Date가 아니면
TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 없습니다.
21.4.4.41.1 TimeString ( tv )
TimeString 추상 연산은 tv (Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출
시 다음 단계를 수행합니다:
hour 에 ToZeroPaddedDecimalString (ℝ (HourFromTime (tv )),
2)를 할당한다.
minute 에 ToZeroPaddedDecimalString (ℝ (MinFromTime (tv )), 2).
second 에 ToZeroPaddedDecimalString (ℝ (SecFromTime (tv )), 2).
hour , ":" , minute ,
":" , second , 코드 유닛 0x0020(SPACE),
"GMT" 을 string-concatenation 으로 반환한다.
21.4.4.41.2 DateString ( tv )
DateString 추상 연산은 tv (Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출
시 다음 단계를 수행합니다:
weekday 에 표 65 에서
WeekDay (tv )에 해당하는 Name을
할당한다.
month 에 표 66 에서
MonthFromTime (tv )에
해당하는 Name을 할당한다.
day 에 ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )),
2)를 할당한다.
yv 에 YearFromTime (tv )를
할당한다.
yv 가 +0 𝔽 이거나 yv >
+0 𝔽 이면 yearSign 을 빈 문자열로, 아니면
yearSign 을 "-" 로 설정한다.
paddedYear 에 ToZeroPaddedDecimalString (abs (ℝ (yv )), 4)를
할당한다.
weekday , 코드 유닛 0x0020(SPACE), month , 코드 유닛 0x0020(SPACE),
day , 코드 유닛 0x0020(SPACE), yearSign , paddedYear 를
string-concatenation 으로 반환한다.
표 65: 요일 이름
숫자
이름
+0 𝔽
"Sun"
1 𝔽
"Mon"
2 𝔽
"Tue"
3 𝔽
"Wed"
4 𝔽
"Thu"
5 𝔽
"Fri"
6 𝔽
"Sat"
표 66: 월 이름
숫자
이름
+0 𝔽
"Jan"
1 𝔽
"Feb"
2 𝔽
"Mar"
3 𝔽
"Apr"
4 𝔽
"May"
5 𝔽
"Jun"
6 𝔽
"Jul"
7 𝔽
"Aug"
8 𝔽
"Sep"
9 𝔽
"Oct"
10 𝔽
"Nov"
11 𝔽
"Dec"
21.4.4.41.3 TimeZoneString ( tv )
TimeZoneString 추상 연산은 tv (정수 Number )를 인수로 받아 문자열을 반환합니다. 호출 시 다음
단계를 수행합니다:
systemTimeZoneIdentifier 에 SystemTimeZoneIdentifier ()를
할당한다.
IsTimeZoneOffsetString (systemTimeZoneIdentifier )
가 true 이면,
offsetNs 에 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )를
할당한다.
그 외,
offsetNs 에 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier ,
ℤ (ℝ (tv ) × 106 ))를
할당한다.
offset 에 𝔽 (truncate (offsetNs /
106 ))를 할당한다.
offset 이 +0 𝔽 이거나 offset >
+0 𝔽 이면,
offsetSign 에 "+" 를 할당한다.
absOffset 에 offset 을 할당한다.
그 외,
offsetSign 에 "-" 를 할당한다.
absOffset 에 -offset 을 할당한다.
offsetMin 에 ToZeroPaddedDecimalString (ℝ (MinFromTime (absOffset )),
2)를 할당한다.
offsetHour 에 ToZeroPaddedDecimalString (ℝ (HourFromTime (absOffset )),
2)를 할당한다.
tzName 에 빈 문자열 또는 코드 유닛 0x0020(SPACE), 코드 유닛 0x0028(LEFT PAREN),
구현 정의 타임존 이름, 코드 유닛
0x0029(RIGHT PAREN)를 string-concatenation 으로 연결한
문자열 중 하나를 할당한다.
offsetSign , offsetHour , offsetMin ,
tzName 를 string-concatenation 으로 반환한다.
21.4.4.41.4 ToDateString ( tv )
ToDateString 추상 연산은 tv (정수 Number 또는 NaN )를 인수로
받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
DateString (t ), 코드 유닛
0x0020(SPACE), TimeString (t ),
TimeZoneString (tv )를
string-concatenation 으로 반환한다.
21.4.4.42 Date.prototype.toTimeString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
t 에 LocalTime (tv )를 할당한다.
TimeString (t )과 TimeZoneString (tv )를
string-concatenation 으로 반환한다.
21.4.4.43 Date.prototype.toUTCString ( )
이 메서드는 this 값에 해당하는 시점을 나타내는 문자열 값을 반환합니다. 문자열 형식은 RFC 7231의 "HTTP-date"를
기반으로 하며, ECMAScript Date가 지원하는 전체 시간 범위를 일반화하여 지원합니다.
호출 시 다음 단계를 수행합니다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
tv 에 dateObject .[[DateValue]] 를 할당한다.
tv 가 NaN 이면 "Invalid
Date" 를 반환한다.
weekday 에 표 65 에서 WeekDay (tv )에 해당하는 이름을 할당한다.
month 에 표 66 에서 MonthFromTime (tv )에 해당하는
이름을 할당한다.
day 에 ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )), 2)를
할당한다.
yv 에 YearFromTime (tv )를 할당한다.
yv 가 +0 𝔽 이거나 yv >
+0 𝔽 이면 yearSign 을 빈 문자열로, 아니면
yearSign 을 "-" 로 설정한다.
paddedYear 에 ToZeroPaddedDecimalString (abs (ℝ (yv )), 4)를
할당한다.
weekday , "," , 코드 유닛 0x0020(SPACE),
day , 코드 유닛 0x0020(SPACE), month , 코드 유닛 0x0020(SPACE),
yearSign , paddedYear , 코드 유닛 0x0020(SPACE), TimeString (tv )를 string-concatenation 으로 반환한다.
21.4.4.44 Date.prototype.valueOf ( )
이 메서드는 호출 시 다음 단계를 수행한다:
dateObject 에 this 값을 할당한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
dateObject .[[DateValue]] 를 반환한다.
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] (
hint )
이 메서드는 ECMAScript 언어 연산자가 Date를 원시값으로 변환할 때 호출됩니다. hint 의 허용 값은
"default" , "number" , "string" 입니다.
Date는 내장 ECMAScript 객체 중 유일하게 "default" 를 "string" 과
동등하게 취급합니다. 다른 내장 ECMAScript 객체는 "default" 를 "number" 과
동등하게 취급합니다.
호출 시 다음 단계를 수행합니다:
O 에 this 값을 할당한다.
O 가 객체가 아니면 , TypeError
예외를 던진다.
hint 가 "string" 또는 "default" 이면,
tryFirst 에 string 을 할당한다.
그 외 hint 가 "number" 이면,
tryFirst 에 number 를 할당한다.
그 외,
TypeError 예외를 던진다.
? OrdinaryToPrimitive (O ,
tryFirst )를 반환한다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }이다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.toPrimitive]" 이다.
21.4.5 Date 인스턴스의 속성
Date 인스턴스는 일반
객체 이며, Date 프로토타입
객체 로부터 프로퍼티를 상속받습니다. Date 인스턴스는 또한 [[DateValue]]
내부 슬롯을 가집니다. [[DateValue]] 내부 슬롯은 이 Date가 나타내는 시간 값 입니다.
22 텍스트 처리
22.1 문자열 객체
22.1.1 String 생성자
String 생성자 :
%String% 이다.
"String" 프로퍼티의 초기값이며, 글로벌 객체 에 존재한다.
생성자 로 호출
시 새로운 문자열 객체를 생성 및 초기화한다.
생성자 가 아닌
함수로 호출 시, 타입 변환을 수행한다.
클래스 정의의 extends 절 값으로 사용될 수 있다. String 동작을 상속하려는 서브클래스 생성자 는 [[StringData]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 String
생성자 에 대한
super 호출을 포함해야 한다.
22.1.1.1 String ( value )
이 함수는 호출 시 다음 단계를 수행한다:
value 가 없으면,
s 에 빈 문자열을 할당한다.
그 외,
NewTarget이 undefined 이고 value 가 Symbol 이면,
SymbolDescriptiveString (value )를
반환한다.
s 에 ? ToString (value )를 할당한다.
NewTarget이 undefined 이면 s 를 반환한다.
StringCreate (s ,
? GetPrototypeFromConstructor (NewTarget,
"%String.prototype%" ))를 반환한다.
22.1.2 String 생성자의 속성
String 생성자 :
22.1.2.1 String.fromCharCode ( ...codeUnits )
이 함수는 임의 개수의 인수(codeUnits rest parameter)를 받아 호출될 수 있다.
호출 시 다음 단계를 수행한다:
result 에 빈 문자열을 할당한다.
codeUnits 의 각 요소 next 에 대해,
nextCU 에 next 를 ? ToUint16 로 변환한 후 ℝ 로 변환한 코드 유닛 값을
할당한다.
result 에 result 와 nextCU 를 문자열 연결 한 결과를 재할당한다.
result 를 반환한다.
이 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
22.1.2.2 String.fromCodePoint ( ...codePoints )
이 함수는 임의 개수의 인수(codePoints rest parameter)를 받아 호출될 수 있다.
호출 시 다음 단계를 수행한다:
result 에 빈 문자열을 할당한다.
codePoints 의 각 요소 next 에 대해,
nextCP 에 ? ToNumber (next )를 할당한다.
nextCP 가 정수 Number 가 아니면
RangeError 예외를 던진다.
ℝ (nextCP ) < 0 또는 ℝ (nextCP ) > 0x10FFFF이면
RangeError 예외를 던진다.
result 에 result 와 UTF16EncodeCodePoint (ℝ (nextCP ))를 문자열 연결 하여 재할당한다.
Assert :
codePoints 가 비어 있으면 result 는 빈 문자열이다.
result 를 반환한다.
이 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
22.1.2.3 String.prototype
String.prototype의 초기값은 String 프로토타입
객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.1.2.4 String.raw ( template ,
...substitutions )
이 함수는 가변 개수의 인수를 받는다. 첫 번째 인수는 template , 나머지는 List
substitutions 이다.
호출 시 다음 단계를 수행한다:
substitutionCount 에 substitutions 의 요소 개수를 할당한다.
cooked 에 ? ToObject (template )를 할당한다.
literals 에 ? ToObject (? Get (cooked ,
"raw" ))를 할당한다.
literalCount 에 ? LengthOfArrayLike (literals )를
할당한다.
literalCount ≤ 0이면 빈 문자열을 반환한다.
R 에 빈 문자열을 할당한다.
nextIndex 에 0을 할당한다.
반복,
nextLiteralVal 에 ? Get (literals ,
! ToString (𝔽 (nextIndex )))를
할당한다.
nextLiteral 에 ? ToString (nextLiteralVal )를
할당한다.
R 에 R 과 nextLiteral 를 문자열 연결 한 결과를 재할당한다.
nextIndex + 1 = literalCount 이면 R 를 반환한다.
nextIndex < substitutionCount 이면,
nextSubVal 에
substitutions [nextIndex ]를 할당한다.
nextSub 에 ? ToString (nextSubVal )를
할당한다.
R 에 R 과 nextSub 를 문자열 연결 한 결과를
재할당한다.
nextIndex 에 nextIndex + 1을 할당한다.
참고
이 함수는 Tagged Template (13.3.11 )의 태그 함수로 사용하기 위해
설계되었습니다. 그렇게 호출될 때 첫 번째 인수는 올바른 템플릿 객체이며 나머지 rest parameter는 치환값을 포함하게 됩니다.
22.1.3 String 프로토타입 객체의 속성
String 프로토타입 객체 :
%String.prototype% 이다.
문자열
익조틱
객체 이며 해당 객체에 대해 지정된 내부 메서드를 가진다.
[[StringData]] 내부 슬롯을 가지며, 그 값은 빈 문자열이다.
"length" 프로퍼티를 가지며 초기값은 +0 𝔽 이고, 속성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
별도로 명시되지 않는 한, 아래에 정의된 String 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은
반드시 문자열 값이거나 [[StringData]] 내부 슬롯이 문자열 값으로 초기화된 객체여야 한다.
22.1.3.1 String.prototype.at ( index )
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
relativeIndex 에 ? ToIntegerOrInfinity (index )를
할당한다.
relativeIndex ≥ 0이면,
k 에 relativeIndex 를 할당한다.
그 외,
k 에 len + relativeIndex 를 할당한다.
k < 0 또는 k ≥ len 이면 undefined 를
반환한다.
S 의 k 부터 k + 1까지의 부분 문자열 을 반환한다.
22.1.3.2 String.prototype.charAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛을 포함하는 단일 요소 문자열을 반환한다. 해당
인덱스에 요소가 없으면 결과는 빈 문자열이다. 결과는 문자열 값이며,
문자열 객체가 아니다.
pos가 정수 Number 이면,
x.charAt(pos)의 결과는 x.substring(pos, pos + 1)의 결과와 같다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면 빈 문자열을 반환한다.
S 의 position 부터 position + 1까지의 부분 문자열 을
반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.3 String.prototype.charCodeAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛의 숫자 값을 나타내는 Number(음이 아닌
정수
Number 이며 216 미만)를 반환한다. 해당 인덱스에 요소가 없으면 결과는
NaN 이다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면
NaN 을 반환한다.
S 의 position 인덱스 코드 유닛의 숫자 값을 Number
값 으로 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.4 String.prototype.codePointAt ( pos )
참고 1
이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에서 시작하는 UTF-16 인코딩 코드 포인트(6.1.4 )의 숫자
값을 나타내는 음이 아닌 정수
Number (0x10FFFF 𝔽 이하)를 반환한다. 해당
인덱스에 요소가 없으면 결과는 undefined 이다. 유효한 UTF-16 서로게이트
페어 가 pos 에서 시작하지 않으면, 결과는 pos 의 코드 유닛이다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
position 에 ? ToIntegerOrInfinity (pos )를
할당한다.
size 에 S 의 길이를 할당한다.
position < 0 또는 position ≥ size 이면
undefined 를 반환한다.
cp 에 CodePointAt (S ,
position )을 할당한다.
cp .[[CodePoint]] 를 𝔽 로 변환하여 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.5 String.prototype.concat ( ...args )
참고 1
이 메서드를 호출하면 this 값을(문자열로 변환) 시작으로 각 인수를 문자열로 변환한 코드 유닛이 뒤따르는 문자열
값을 반환한다. 결과는 문자열 값이며,
문자열 객체가 아니다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
R 에 S 를 할당한다.
args 의 각 요소 next 에 대해,
nextString 에 ? ToString (next )를 할당한다.
R 에 R 과 nextString 을 문자열 연결 한 결과를 재할당한다.
R 를 반환한다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 이다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.6 String.prototype.constructor
String.prototype.constructor의 초기값은 %String% 이다.
22.1.3.7 String.prototype.endsWith ( searchString [ ,
endPosition ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
len 에 S 의 길이를 할당한다.
endPosition 이 undefined 이면 pos 에
len 을, 아니면 pos 에 ? ToIntegerOrInfinity (endPosition )을
할당한다.
end 에 0과
len 사이로 clamping 한 pos 를 할당한다.
searchLength 에 searchStr 의 길이를 할당한다.
searchLength = 0이면 true 를 반환한다.
start 에 end - searchLength 를 할당한다.
start < 0이면 false 를 반환한다.
substring 에 S 의 start 부터 end 까지의 부분 문자열 을
할당한다.
substring 이 searchStr 이면 true 를 반환한다.
false 를 반환한다.
참고 1
이 메서드는 searchString 을 문자열로 변환한 코드 유닛 시퀀스가, 이 객체(문자열로 변환)의
endPosition - length(this)에서 시작하는 코드 유닛과 동일하면 true 를
반환한다. 그렇지 않으면 false 를 반환한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.8 String.prototype.includes ( searchString [ ,
position ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
pos 에 ? ToIntegerOrInfinity (position )를
할당한다.
Assert :
position 이 undefined 이면 pos 는 0이다.
len 에 S 의 길이를 할당한다.
start 에 0과
len 사이로 clamping 한 pos 를 할당한다.
index 에 StringIndexOf (S ,
searchStr , start )를 할당한다.
index 가 not-found 이면 false 를 반환한다.
true 를 반환한다.
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서
부분 문자열 로 나타나면 true 를 반환하고, 그렇지 않으면
false 를 반환한다. position 이 undefined 이면
0으로 간주되어 전체 문자열을 검색한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.9 String.prototype.indexOf ( searchString [ ,
position ] )
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서
부분 문자열 로 나타나면, 가장 작은 해당 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환한다. position 이
undefined 이면 +0 𝔽 으로 간주되어 전체 문자열을
검색한다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
searchStr 에 ? ToString (searchString )를 할당한다.
pos 에 ? ToIntegerOrInfinity (position )를
할당한다.
Assert :
position 이 undefined 이면 pos 는 0이다.
len 에 S 의 길이를 할당한다.
start 에 0과
len 사이로 clamping 한 pos 를 할당한다.
result 에 StringIndexOf (S ,
searchStr , start )를 할당한다.
result 가 not-found 이면
-1 𝔽 를 반환한다.
𝔽 (result )를 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.10 String.prototype.isWellFormed ( )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
IsStringWellFormedUnicode (S )를
반환한다.
22.1.3.11 String.prototype.lastIndexOf ( searchString
[ , position ] )
참고 1
searchString 이 이 객체를 문자열로 변환한 결과에서 position 이하의 인덱스에서
부분 문자열 로 나타나면, 가장 큰 해당 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환한다. position 이
undefined 이면 문자열 값의 길이로 간주되어 전체 문자열을 검색한다.
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
searchStr 에 ? ToString (searchString )를 할당한다.
numPos 에 ? ToNumber (position )를 할당한다.
Assert :
position 이 undefined 이면 numPos 는
NaN 이다.
numPos 가 NaN 이면 pos 에 +∞를, 아니면 pos 에
! ToIntegerOrInfinity (numPos )를
할당한다.
len 에 S 의 길이를 할당한다.
searchLen 에 searchStr 의 길이를 할당한다.
start 에 0과
len - searchLen 사이로 clamping 한
pos 를 할당한다.
result 에 StringLastIndexOf (S ,
searchStr , start )를 할당한다.
result 가 not-found 이면
-1 𝔽 를 반환한다.
𝔽 (result )를 반환한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.12 String.prototype.localeCompare ( that [ ,
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 NaN 이 아닌 Number를 반환하며, this 값을(문자열 S 로
변환) that 과(문자열 thatValue 로 변환) 구현 정의 로케일 민감한 문자열 비교
결과를 나타낸다. 결과는 정렬
순서 에 따라 S 가 thatValue 앞에 있으면 음수, 뒤에 있으면 양수, 그 외의
경우(상대적 순서가 없는 경우) 0이 된다.
비교 전, 이 메서드는 문자열을 준비하기 위해 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
thatValue 에 ? ToString (that )를 할당한다.
이 메서드의 두 번째, 세 번째 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를
할당해서는 안 된다.
실제 반환 값은 구현 정의 로, 추가 정보를 인코딩할 수 있도록 허용되지만, 이
메서드는 두 인수에 대해 일관된 비교자 로서 모든 문자열 집합에 대해 전체 순서를 정의해야 한다.
또한, 이 메서드는 유니코드 표준에 따라 정규 동등성을 인식하고 존중해야 하며, 구분 가능한 문자열이 정규 동등할 경우 비교 결과는
+0 𝔽 이어야 한다.
참고 1
이 메서드는 Array.prototype.sort의 인수로 직접 적합하지 않다. 후자는 두 인수의 함수가 필요하기 때문이다.
참고 2
이 메서드는 ECMAScript 환경에서 호스트 환경 에서 제공하는 언어나 로케일 민감 비교 기능에 의존할
수 있으며, 호스트 환경의 현재 로케일 관습에 따라 비교하도록 설계되었다. 그러나 비교 기능과 상관없이 이 메서드는 반드시 유니코드 표준의 정규
동등성을 인식하고 존중해야 한다. 예를 들어, 다음 비교는 모두 +0 𝔽 을 반환해야 한다:
"\u212B" .localeCompare ("A\u030A" )
"\u2126" .localeCompare ("\u03A9" )
"\u1E69" .localeCompare ("s\u0307\u0323" )
"\u1E0B\u0323" .localeCompare ("\u1E0D\u0307" )
"\u1100\u1161" .localeCompare ("\uAC00" )
정규 동등성의 정의와 논의는 유니코드 표준 2, 3장, Unicode
Standard Annex #15, Unicode Normalization Forms , Unicode Technical Note #5, Canonical
Equivalence in Applications , Unicode Technical Standard #10, Unicode
Collation Algorithm 를 참조.
이 메서드는 유니코드 호환 동등성 또는 호환 분해(유니코드 표준 3장 3.7절 참조)는
존중하지 않는 것이 권장된다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.13 String.prototype.match ( regexp )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
matcher 에 ? GetMethod (regexp ,
%Symbol.match% )를 할당한다.
matcher 가 undefined 가 아니면,
? Call (matcher ,
regexp , « O »)를 반환한다.
S 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
undefined )를 할당한다.
? Invoke (rx , %Symbol.match% , «
S »)를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.14 String.prototype.matchAll ( regexp )
이 메서드는 this 값을 나타내는 문자열에 대해 regexp 로 정규표현식 매칭을 수행하고, 매칭 결과를 산출하는
이터레이터 를 반환한다. 각 매칭 결과는 문자열에서 매칭된 부분을 첫
번째 요소로 하고, 이후에는 캡처 그룹에 매칭된 부분이 순서대로 들어있는 배열이다. 정규표현식이 한 번도 매칭되지 않으면, 반환된 이터레이터 는 아무 매칭 결과도 산출하지 않는다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
isRegExp 에 ? IsRegExp (regexp )를
할당한다.
isRegExp 가 true 이면,
flags 에 ? Get (regexp ,
"flags" )를 할당한다.
? RequireObjectCoercible (flags )를
수행한다.
? ToString (flags )에
"g" 가 포함되어 있지 않으면 TypeError 예외를
던진다.
matcher 에 ? GetMethod (regexp ,
%Symbol.matchAll% )를
할당한다.
matcher 가 undefined 가 아니면,
? Call (matcher ,
regexp , « O »)를 반환한다.
S 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
"g" )를 할당한다.
? Invoke (rx , %Symbol.matchAll% , «
S »)를 반환한다.
참고 1
이 메서드는 의도적으로 generic이므로 this 값이 반드시 문자열 객체일
필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.
참고 2
String.prototype.split과 유사하게
String.prototype.matchAll은 일반적으로 입력값을 변형하지 않도록 설계되었다.
22.1.3.15 String.prototype.normalize ( [ form ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
form 이 undefined 이면 f 에
"NFC" 를 할당한다.
그 외에는 f 에 ? ToString (form )을 할당한다.
f 가 "NFC" , "NFD" ,
"NFKC" , "NFKD" 중 하나가 아니면
RangeError 예외를 던진다.
ns 에 최신 유니코드
표준, Normalization Forms 에 명시된 대로 S 를 f 가 지정하는 정규화 형식으로
정규화한 결과 문자열 값을 할당한다.
ns 를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.16 String.prototype.padEnd ( maxLength [ ,
fillString ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
? StringPaddingBuiltinsImpl (O ,
maxLength , fillString , end )를 반환한다.
22.1.3.17 String.prototype.padStart ( maxLength [ ,
fillString ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
? StringPaddingBuiltinsImpl (O ,
maxLength , fillString , start )를 반환한다.
22.1.3.17.1 StringPaddingBuiltinsImpl ( O ,
maxLength , fillString , placement )
StringPaddingBuiltinsImpl 추상 연산은 O (ECMAScript 언어 값 ),
maxLength (ECMAScript 언어 값 ),
fillString (ECMAScript 언어 값 ),
placement (start 또는 end )를 인수로 받고
정상 완료 (문자열 포함)
또는 throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
S 에 ? ToString (O )를 할당한다.
intMaxLength 에 ℝ (? ToLength (maxLength ))를
할당한다.
stringLength 에 S 의 길이를 할당한다.
intMaxLength ≤ stringLength 이면 S 를 반환한다.
fillString 이 undefined 이면 fillString 을 코드
유닛 0x0020(SPACE)만으로 구성된 문자열 값으로 설정한다.
그 외에는 fillString 을 ? ToString (fillString )으로
설정한다.
StringPad (S ,
intMaxLength , fillString , placement )를 반환한다.
22.1.3.17.2 StringPad ( S , maxLength ,
fillString , placement )
StringPad 추상 연산은 S (문자열), maxLength (음이 아닌 정수 ), fillString (문자열),
placement (start 또는 end )를 인수로 받고
문자열을 반환한다. 호출 시 다음 단계를 수행한다:
stringLength 에 S 의 길이를 할당한다.
maxLength ≤ stringLength 이면 S 를 반환한다.
fillString 이 빈 문자열이면 S 를 반환한다.
fillLen 에 maxLength - stringLength 를 할당한다.
truncatedStringFiller 에 fillString 을 반복 연결한 후
fillLen 길이로 잘라낸 문자열 값을 할당한다.
placement 가 start 이면
truncatedStringFiller 와 S 를 문자열 연결 하여 반환한다.
그 외에는 S 와 truncatedStringFiller 를 문자열 연결 하여 반환한다.
참고 1
maxLength 인수는 S 의 길이보다 작아질 수 없도록 clamping된다.
참고 2
fillString 인수의 기본값은 " " (코드 유닛 0x0020 SPACE만으로 구성된
문자열)이다.
22.1.3.17.3 ToZeroPaddedDecimalString ( n ,
minLength )
ToZeroPaddedDecimalString 추상 연산은 n (음이 아닌 정수 ), minLength (음이 아닌
정수 )를 인수로 받고
문자열을 반환한다. 호출 시 다음 단계를 수행한다:
S 에 n 의 십진수 문자열 표현을 할당한다.
StringPad (S ,
minLength , "0" , start )를
반환한다.
22.1.3.18 String.prototype.repeat ( count )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
n 에 ? ToIntegerOrInfinity (count )를
할당한다.
n < 0 또는 n = +∞이면 RangeError 예외를 던진다.
n = 0이면 빈 문자열을 반환한다.
S 를 n 번 이어붙인 문자열 값을 반환한다.
참고 1
이 메서드는 this 값을(문자열로 변환) count 번 반복한 코드 유닛으로 구성된 문자열 값을
생성한다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.19 String.prototype.replace ( searchValue ,
replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
searchValue 가 undefined 또는 null 이
아니면,
replacer 에 ? GetMethod (searchValue ,
%Symbol.replace% )를
할당한다.
replacer 가 undefined 가 아니면,
? Call (replacer ,
searchValue , « O ,
replaceValue »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
searchString 에 ? ToString (searchValue )를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 가 false 이면,
replaceValue 를 ? ToString (replaceValue )로
재설정한다.
searchLength 에 searchString 의 길이를 할당한다.
position 에 StringIndexOf (string ,
searchString , 0)을 할당한다.
position 이 not-found 이면 string 을 반환한다.
preceding 에 string 의 0부터 position 까지의 부분 문자열 을
할당한다.
following 에 string 의 position +
searchLength 부터 끝까지의 부분 문자열 을 할당한다.
functionalReplace 가 true 이면,
replacement 에 ? ToString (?
Call (replaceValue ,
undefined , « searchString , 𝔽 (position ),
string »))를 할당한다.
그 외에는,
Assert : replaceValue
는
문자열 이다.
captures 에 새 빈 List 를
할당한다.
replacement 에 ! GetSubstitution (searchString ,
string , position , captures ,
undefined , replaceValue )를 할당한다.
preceding , replacement , following 을 문자열
연결 하여 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.19.1 GetSubstitution ( matched ,
str , position , captures , namedCaptures ,
replacementTemplate )
GetSubstitution 추상 연산은 matched (문자열), str (문자열),
position (음이 아닌 정수 ), captures (문자열 또는
undefined 의 List ),
namedCaptures (객체 또는 undefined ),
replacementTemplate (문자열)을 인수로 받고 정상 완료 (문자열 포함)
또는 throw 완료 를 반환한다.
이 추상 연산에서 십진수 숫자 는 포함 구간 0x0030(DIGIT ZERO)부터
0x0039(DIGIT NINE)까지의 코드 유닛이다. 호출 시 다음 단계를 수행한다:
stringLength 에 str 의 길이를 할당한다.
Assert : position ≤
stringLength .
result 에 빈 문자열을 할당한다.
templateRemainder 에 replacementTemplate 를 할당한다.
templateRemainder 가 빈 문자열이 아닌 동안 반복,
NOTE: 아래 단계는
ref (templateRemainder 의 접두사)를 추출하고,
refReplacement (치환값)를 결정한 후 그 치환값을 result 에 추가한다.
templateRemainder 가 "$$" 로 시작하면,
ref 에 "$$" 를 할당한다.
refReplacement 에 "$" 를 할당한다.
그 외 templateRemainder 가 "$`" 로 시작하면,
ref 에 "$`" 를 할당한다.
refReplacement 에 str 의 0부터
position 까지의 부분 문자열 을
할당한다.
그 외 templateRemainder 가 "$&" 로 시작하면,
ref 에 "$&" 를 할당한다.
refReplacement 에 matched 를 할당한다.
그 외 templateRemainder 가 "$'" (0x0024(DOLLAR
SIGN) + 0x0027(APOSTROPHE))로 시작하면,
ref 에 "$'" 를 할당한다.
matchLength 에 matched 의 길이를 할당한다.
tailPos 에 position +
matchLength 를 할당한다.
refReplacement 에 str 의 min (tailPos ,
stringLength )부터 끝까지의 부분 문자열 을
할당한다.
NOTE: tailPos 가 stringLength 를 초과할 수 있는 경우는
intrinsic %Symbol.replace%
메서드가 %RegExp.prototype% 의
intrinsic %RegExp.prototype.exec%가 아닌 "exec" 프로퍼티를 가진 객체에 대해 호출된
경우이다.
그 외 templateRemainder 가 "$" + 1개 이상의 십진수
숫자로 시작하면,
templateRemainder 가 "$" + 2개 이상의
십진수 숫자로 시작하면 digitCount 에 2를, 아니면 1을 할당한다.
digits 에 templateRemainder 의 1부터 1 +
digitCount 까지의 부분 문자열 을
할당한다.
index 에 ℝ (StringToNumber (digits ))를
할당한다.
Assert : 0 ≤
index ≤ 99.
captureLen 에 captures 요소 개수를 할당한다.
index > captureLen 이고
digitCount = 2이면,
NOTE: 두 자리 치환 패턴이 캡처 그룹 개수를 초과하는 인덱스를 지정하면, 한 자리 치환 패턴 +
리터럴 숫자로 처리한다.
digitCount 를 1로 재설정한다.
digits 를 digits 의 0부터 1까지의 부분 문자열 로 재설정한다.
index 를 ℝ (StringToNumber (digits ))로
재설정한다.
ref 에 templateRemainder 의 0부터 1 +
digitCount 까지의 부분 문자열 을
할당한다.
1 ≤ index ≤ captureLen 이면,
capture 에 captures [index
- 1]을 할당한다.
capture 가 undefined 이면,
refReplacement 에 빈 문자열을 할당한다.
그 외에는,
refReplacement 에 capture 를
할당한다.
그 외에는,
refReplacement 에 ref 를 할당한다.
그 외 templateRemainder 가 "$<" 로 시작하면,
gtPos 에 StringIndexOf (templateRemainder ,
">" , 0)을 할당한다.
gtPos 가 not-found 이거나
namedCaptures 가 undefined 이면,
ref 에 "$<" 를 할당한다.
refReplacement 에 ref 를 할당한다.
그 외에는,
ref 에 templateRemainder 의 0부터
gtPos + 1까지의 부분
문자열 을 할당한다.
groupName 에 templateRemainder 의 2부터
gtPos 까지의 부분
문자열 을 할당한다.
Assert :
namedCaptures 는 객체 이다.
capture 에 ? Get (namedCaptures ,
groupName )을 할당한다.
capture 가 undefined 이면,
refReplacement 에 빈 문자열을 할당한다.
그 외에는,
refReplacement 에 ? ToString (capture )를
할당한다.
그 외에는,
ref 에 templateRemainder 의 0부터 1까지의 부분
문자열 을 할당한다.
refReplacement 에 ref 를 할당한다.
refLength 에 ref 의 길이를 할당한다.
templateRemainder 를 templateRemainder 의
refLength 부터 끝까지의 부분 문자열 로 재설정한다.
result 에 result 와 refReplacement 를
문자열 연결 한 결과를 할당한다.
result 를 반환한다.
22.1.3.20 String.prototype.replaceAll ( searchValue ,
replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
searchValue 가 undefined 또는 null 이
아니면,
isRegExp 에 ? IsRegExp (searchValue )를
할당한다.
isRegExp 가 true 이면,
flags 에 ? Get (searchValue ,
"flags" )를 할당한다.
? RequireObjectCoercible (flags )를
수행한다.
? ToString (flags )에
"g" 가 포함되어 있지 않으면 TypeError 예외를
던진다.
replacer 에 ? GetMethod (searchValue ,
%Symbol.replace% )를
할당한다.
replacer 가 undefined 가 아니면,
? Call (replacer ,
searchValue , « O ,
replaceValue »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
searchString 에 ? ToString (searchValue )를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 가 false 이면,
replaceValue 를 ? ToString (replaceValue )로
재설정한다.
searchLength 에 searchString 의 길이를 할당한다.
advanceBy 에 max (1, searchLength )를 할당한다.
matchPositions 에 새 빈 List 를 할당한다.
position 에 StringIndexOf (string ,
searchString , 0)를 할당한다.
position 이 not-found 가 아닌 동안 반복,
matchPositions 에 position 을 추가한다.
position 을 StringIndexOf (string ,
searchString , position + advanceBy )로 재설정한다.
endOfLastMatch 에 0을 할당한다.
result 에 빈 문자열을 할당한다.
matchPositions 의 각 요소 p 에 대해,
preserved 에 string 의 endOfLastMatch 부터
p 까지의 부분 문자열 을 할당한다.
functionalReplace 가 true 이면,
replacement 에 ? ToString (? Call (replaceValue ,
undefined , « searchString , 𝔽 (p ),
string »))를 할당한다.
그 외에는,
Assert :
replaceValue 는
문자열 이다.
captures 에 새 빈 List 를
할당한다.
replacement 에 ! GetSubstitution (searchString ,
string , p , captures ,
undefined , replaceValue )를 할당한다.
result 에 result , preserved ,
replacement 를 문자열 연결 한
결과로 재설정한다.
endOfLastMatch 를 p + searchLength 로 재설정한다.
endOfLastMatch 가 string 의 길이보다 작으면,
result 에 result 와 string 의
endOfLastMatch 부터 끝까지의 부분 문자열 을 문자열 연결 하여 재설정한다.
result 를 반환한다.
22.1.3.21 String.prototype.search ( regexp )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
regexp 가 undefined 또는 null 이 아니면,
searcher 에 ? GetMethod (regexp ,
%Symbol.search% )를
할당한다.
searcher 가 undefined 가 아니면,
? Call (searcher ,
regexp , « O »)를 반환한다.
string 에 ? ToString (O )를 할당한다.
rx 에 ? RegExpCreate (regexp ,
undefined )를 할당한다.
? Invoke (rx , %Symbol.search% , «
string »)를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.22 String.prototype.slice ( start ,
end )
이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(또는 end 가
undefined 일 경우 문자열 끝까지, end 는 포함하지 않음)까지의 부분
문자열 를 반환한다. start 가 음수이면, sourceLength +
start (sourceLength 는 문자열 길이)로 처리한다. end 가 음수이면,
sourceLength + end 로 처리한다(sourceLength 는 문자열 길이). 결과는
문자열 값이며, 문자열 객체가
아니다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
intStart 에 ? ToIntegerOrInfinity (start )를
할당한다.
intStart = -∞이면 from 에 0을 할당한다.
그 외 intStart < 0이면 from 에 max (len +
intStart , 0)을 할당한다.
그 외에는 from 에 min (intStart , len )를
할당한다.
end 이 undefined 이면 intEnd 에 len 을,
아니면 intEnd 에 ? ToIntegerOrInfinity (end )를
할당한다.
intEnd = -∞이면 to 에 0을 할당한다.
그 외 intEnd < 0이면 to 에 max (len +
intEnd , 0)을 할당한다.
그 외에는 to 에 min (intEnd , len )를 할당한다.
from ≥ to 이면 빈 문자열을 반환한다.
S 의 from 부터 to 까지의 부분 문자열 을 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.23 String.prototype.split ( separator ,
limit )
이 메서드는 이 객체를 문자열로 변환한 결과의 부분 문자열을 저장한 배열(Array)을 반환한다. 부분 문자열은 왼쪽에서 오른쪽으로
separator 가 나타나는 위치를 찾아 구분하여 만들어지며, separator 는 반환 배열의 문자열에는 포함되지 않고,
문자열을 나누는 역할을 한다. separator 는 임의의 길이의 문자열이거나 %Symbol.split% 메서드를 가진 객체(예: RegExp)일
수 있다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
separator 가 undefined 또는 null 이 아니면,
splitter 에 ? GetMethod (separator ,
%Symbol.split% )를 할당한다.
splitter 가 undefined 가 아니면,
? Call (splitter ,
separator , « O , limit »)를
반환한다.
S 에 ? ToString (O )를 할당한다.
limit 이 undefined 이면 lim 에 232 -
1을, 아니면 lim 에 ℝ (? ToUint32 (limit ))을 할당한다.
R 에 ? ToString (separator )를 할당한다.
lim = 0이면,
CreateArrayFromList (« »)를
반환한다.
separator 가 undefined 이면,
CreateArrayFromList («
S »)를 반환한다.
separatorLength 에 R 의 길이를 할당한다.
separatorLength = 0이면,
strLen 에 S 의 길이를 할당한다.
outLen 에 clamping
lim 을 0과 strLen 사이로 한 값을 할당한다.
head 에 S 의 0부터 outLen 까지의 부분
문자열 을 할당한다.
codeUnits 에 head 의 각 요소 코드 유닛 시퀀스로 구성된 List 를
할당한다.
CreateArrayFromList (codeUnits )를
반환한다.
S 가 빈 문자열이면 CreateArrayFromList («
S »)를 반환한다.
substrings 에 새 빈 List 를 할당한다.
i 에 0을 할당한다.
j 에 StringIndexOf (S ,
R , 0)을 할당한다.
j 가 not-found 가 아닌 동안 반복,
T 에 S 의 i 부터 j 까지의 부분
문자열 을 할당한다.
substrings 에 T 를 추가한다.
substrings 의 요소 개수가 lim 이면 CreateArrayFromList (substrings )를
반환한다.
i 를 j + separatorLength 로 재설정한다.
j 를 StringIndexOf (S ,
R , i )로 재설정한다.
T 에 S 의 i 부터 끝까지의 부분 문자열 을 할당한다.
substrings 에 T 를 추가한다.
CreateArrayFromList (substrings )를
반환한다.
참고 1
separator 값이 빈 문자열일 수 있다. 이 경우 separator 는 입력 문자열의 시작, 끝, 이전
separator 매치의 끝의 빈 부분 문자열 에는 매치되지 않는다.
separator 가 빈 문자열이면, 문자열은 개별 코드 유닛 요소로 분할되고, 결과 배열의 길이는 문자열의 길이와 같으며 각
부분 문자열 은 하나의 코드 유닛을 포함한다.
this 값이(혹은 변환된 값이) 빈 문자열이면, 결과는 separator 가 빈 문자열과 매치될 수
있는지에 따라 달라진다. 가능하면 결과 배열은 요소가 없고, 불가능하면 결과 배열은 빈 문자열 하나만 가진다.
separator 가 undefined 이면, 결과 배열은 변환된
this 값(문자열) 하나만 가진다. limit 가
undefined 가 아니면, 결과 배열은 최대 limit 개 요소로 잘린다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.24 String.prototype.startsWith ( searchString
[ , position ] )
이 메서드는 호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
isRegExp 에 ? IsRegExp (searchString )를 할당한다.
isRegExp 가 true 이면 TypeError 예외를 던진다.
searchStr 에 ? ToString (searchString )를 할당한다.
len 에 S 의 길이를 할당한다.
position 이 undefined 이면 pos 에 0을, 아니면
pos 에 ? ToIntegerOrInfinity (position )을
할당한다.
start 에 clamping 한 pos 를 0과 len
사이로 할당한다.
searchLength 에 searchStr 의 길이를 할당한다.
searchLength = 0이면 true 를 반환한다.
end 에 start + searchLength 를 할당한다.
end > len 이면 false 를 반환한다.
substring 에 S 의 start 부터 end 까지의 부분 문자열 을
할당한다.
substring 이 searchStr 이면 true 를 반환한다.
false 를 반환한다.
참고 1
이 메서드는 searchString 을 문자열로 변환한 코드 유닛 시퀀스가 이 객체(문자열로 변환)의
position 인덱스에서 시작하는 코드 유닛과 같으면 true 를 반환한다. 그렇지 않으면
false 를 반환한다.
참고 2
첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.
참고 3
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.25 String.prototype.substring ( start ,
end )
이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(문자열 끝까지, end 는
포함하지 않음)까지의 부분 문자열 를 반환한다. 결과는 문자열 값이며, 문자열 객체가
아니다.
각 인수가 NaN 또는 음수이면 0으로 대체된다. 각 인수가 문자열의 길이보다 크면 문자열의 길이로 대체된다.
start 가 end 보다 크면, 두 인수를 서로 바꾼다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
len 에 S 의 길이를 할당한다.
intStart 에 ? ToIntegerOrInfinity (start )를
할당한다.
end 이 undefined 이면 intEnd 에 len 을,
아니면 intEnd 에 ? ToIntegerOrInfinity (end )를
할당한다.
finalStart 에 clamping 한 intStart 를 0과
len 사이로 할당한다.
finalEnd 에 clamping 한 intEnd 를 0과
len 사이로 할당한다.
from 에 min (finalStart ,
finalEnd )를 할당한다.
to 에 max (finalStart ,
finalEnd )를 할당한다.
S 의 from 부터 to 까지의 부분 문자열 을 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.26 String.prototype.toLocaleLowerCase ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
toLowerCase와 동작은 동일하지만, 결과가 호스트 환경 의 현재 로케일의 관습에 따라 로케일
의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안
됩니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.27 String.prototype.toLocaleUpperCase ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지
않는 구현의 경우 아래 명세를 따릅니다:
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
toUpperCase와 동작은 동일하지만, 결과가 호스트 환경 의 현재 로케일의 관습에 따라 로케일
의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.
이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안
됩니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.28 String.prototype.toLowerCase ( )
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값)을 할당한다.
S 에 ? ToString (O )를 할당한다.
sText 에 StringToCodePoints (S )를
할당한다.
lowerText 에 유니코드 기본 대소문자 변환 알고리즘에 따라 toLowercase(sText )를 적용한 값을
할당한다.
L 에 CodePointsToString (lowerText )를
할당한다.
L 을 반환한다.
결과는 반드시 유니코드 문자 데이터베이스의 로케일 비의존적 대소문자 변환에 따라 도출되어야 한다(UnicodeData.txt
파일뿐만 아니라, 함께 제공되는 SpecialCasing.txt
파일에 있는 모든 로케일 비의존적 매핑도 포함).
참고 1
일부 코드 포인트의 대소문자 변환 결과는 여러 코드 포인트가 될 수 있다. 이 경우 결과 문자열의 길이는 원본 문자열과 다를 수 있다.
toUpperCase와 toLowerCase 모두 문맥에 따라 동작하므로, 두 메서드는 대칭적이지 않다.
즉, s.toUpperCase().toLowerCase()는 반드시 s.toLowerCase()와 같지
않다.
참고 2
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.29 String.prototype.toString ( )
이 메서드는 호출 시 다음 단계를 수행한다:
? ThisStringValue (this
값)을 반환한다.
참고
String 객체에 대해 이 메서드는 valueOf 메서드와 동일한 값을 반환한다.
22.1.3.30 String.prototype.toUpperCase ( )
이 메서드는 6.1.4 에 설명된 대로 문자열
값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.
동작은 String.prototype.toLowerCase와 동일하지만, 문자열을 유니코드 기본 대소문자 변환 알고리즘의 toUppercase로
매핑한다는 점만 다릅니다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 이전해 사용할 수 있다.
22.1.3.31 String.prototype.toWellFormed ( )
이 메서드는 이 객체의 모든 리딩 서로게이트 및 트레일링
서로게이트 중 서로게이트 페어 의 일부가 아닌 것을 U+FFFD(대체 문자)로 대체한 문자열 표현을
반환한다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값을 할당한다.
S 에 ? ToString (O )를 할당한다.
strLen 에 S 의 길이를 할당한다.
k 에 0을 할당한다.
result 에 빈 문자열을 할당한다.
k < strLen 동안 반복,
cp 에 CodePointAt (S ,
k )를 할당한다.
cp .[[IsUnpairedSurrogate]] 가
true 이면,
result 에 result 와 0xFFFD(대체 문자)를 문자열 연결 하여 재할당한다.
그 외,
result 에 result 와 UTF16EncodeCodePoint (cp .[[CodePoint]] )를 문자열 연결 하여 재할당한다.
k 를 k + cp .[[CodeUnitCount]] 로 재설정한다.
result 를 반환한다.
22.1.3.32 String.prototype.trim ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
start+end )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.32.1 TrimString ( string , where
)
TrimString 추상 연산은 string (ECMAScript 언어
값 )과 where (start ,
end , start+end )를 인수로 받고 정상 완료(문자열 포함) 또는
throw 완료 를 반환한다.
string 을 6.1.4 에 따라
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다. 호출 시 다음 단계를 수행한다:
str 에 ? RequireObjectCoercible (string )를
할당한다.
S 에 ? ToString (str )를 할당한다.
where 가 start 이면,
T 에 S 의 앞쪽 공백이 제거된 복사본을 할당한다.
그 외 where 가 end 이면,
T 에 S 의 뒤쪽 공백이 제거된 복사본을 할당한다.
그 외,
Assert : where 가
start+end 임을 확인한다.
T 에 S 의 앞뒤 공백이 모두 제거된 복사본을 할당한다.
T 를 반환한다.
공백(white space)의 정의는 WhiteSpace 와 LineTerminator 의 합집합이다. 유니코드 일반 카테고리
“Space_Separator”(“Zs”)에 해당하는지 판단할 때, 코드 유닛 시퀀스는 6.1.4 에 따라
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
22.1.3.33 String.prototype.trimEnd ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
end )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.34 String.prototype.trimStart ( )
이 메서드는 6.1.4 에 따라 문자열 값을
UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.
호출 시 다음 단계를 수행한다:
S 에 this 값을 할당한다.
? TrimString (S ,
start )를 반환한다.
참고
이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의
객체에서 메서드로 사용할 수 있다.
22.1.3.35 String.prototype.valueOf ( )
이 메서드는 호출 시 다음 단계를 수행한다:
? ThisStringValue (this
값을 반환한다.
22.1.3.35.1 ThisStringValue ( value )
ThisStringValue 추상 연산은 value (ECMAScript 언어
값 )를 인수로 받고 정상 완료(문자열 포함) 또는
throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
value 가 문자열 이면
value 를 반환한다.
value 가 객체 이고 value 에 [[StringData]] 내부 슬롯이 있으면,
s 에 value .[[StringData]] 를
할당한다.
Assert : s 가 문자열 임을
확인한다.
s 를 반환한다.
TypeError 예외를 던진다.
22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )
이 메서드는 문자열 값의 코드 포인트를 반복하는 이터레이터 객체 를 반환하며, 각 코드 포인트를 문자열 값으로
반환한다.
호출 시 다음 단계를 수행한다:
O 에 ? RequireObjectCoercible (this
값을 할당한다.
s 에 ? ToString (O )를 할당한다.
closure 에 s 를 캡처하고 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure 를 할당한다:
len 에 s 의 길이를 할당한다.
position 에 0을 할당한다.
position < len 동안 반복,
cp 에 CodePointAt (s ,
position )를 할당한다.
nextIndex 에 position + cp .[[CodeUnitCount]] 를 할당한다.
resultString 에 s 의 position 부터
nextIndex 까지의 부분 문자열 를
할당한다.
position 을 nextIndex 로 재설정한다.
? GeneratorYield (CreateIteratorResultObject (resultString ,
false ))를 수행한다.
NormalCompletion (unused )를
반환한다.
CreateIteratorFromClosure (closure ,
"%StringIteratorPrototype%" , %StringIteratorPrototype% )를
반환한다.
이 메서드의 "name" 프로퍼티 값은 "[Symbol.iterator]" 이다.
22.1.4 String 인스턴스의 속성
String 인스턴스는 String 익조틱 객체 이며 해당 객체에 대해 지정된 내부 메서드를 가진다.
String 인스턴스는 String 프로토타입 객체 로부터
프로퍼티를 상속받는다. 또한 String 인스턴스는 [[StringData]] 내부 슬롯을 가진다. [[StringData]] 내부 슬롯은 이 String 객체가 나타내는 문자열 값이다.
String 인스턴스는 "length" 프로퍼티와 정수 인덱스 이름을 가진 enumerable 프로퍼티 집합을 가진다.
22.1.4.1 length
이 String 객체가 나타내는 문자열 값의 요소 개수.
String 객체가 초기화되면, 이 프로퍼티는 변경되지 않는다. 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.1.5 String 이터레이터 객체
String 이터레이터 는 특정 String 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. String
이터레이터 객체에는 생성자 라는 이름이 붙은 생성자는 없다. 대신, String 이터레이터 객체는 String
인스턴스 객체의 특정 메서드를 호출하여 생성된다.
22.1.5.1 %StringIteratorPrototype% 객체
%StringIteratorPrototype% 객체:
22.1.5.1.1 %StringIteratorPrototype%.next ( )
? GeneratorResume (this
값, empty ,
"%StringIteratorPrototype%" )를 반환한다.
22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag%
]
%Symbol.toStringTag% 프로퍼티의 초기값은
문자열 값 "String Iterator" 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }이다.
22.2 RegExp(정규 표현식) 객체
RegExp 객체는 정규 표현식과 관련 플래그를 포함한다.
참고
정규 표현식의 형식과 기능은 Perl 5 프로그래밍 언어의 정규 표현식 기능을 모델로 한다.
22.2.1 패턴
RegExp 생성자 는
입력 패턴 문자열에 다음 문법을 적용한다. 문법이 문자열을 Pattern 의 확장으로 해석할 수 없으면 오류가 발생한다.
문법
Pattern [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
[empty]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Assertion [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode,
?NamedCaptureGroups]
CharacterClass [?UnicodeMode,
?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers
::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier
:: one of i
m s
SyntaxCharacter ::
one of ^ $ \
. * + ? (
) [ ] { }
|
PatternCharacter ::
SourceCharacter
but not SyntaxCharacter
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode]
::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape ::
one of f n r
t v
GroupSpecifier [UnicodeMode]
::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode]
::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode]
::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode]
::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode]
::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode]
:: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate
::
any Unicode code point in the inclusive interval from U+D800 to
U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to
U+DFFF
선택된 \u HexTrailSurrogate 에 대해 연관된 u
HexLeadSurrogate 의 선택이 모호한
경우, 해당 \u HexLeadSurrogate 는 그 외에는 대응되는 \u
HexTrailSurrogate 가 없는 가장
가까운 u HexLeadSurrogate 에 연관되어야 한다.
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to
0xDBFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to
0xDFFF
IdentityEscape [UnicodeMode]
:: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter
but not UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode]
::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName
::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue
::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
_
CharacterClass [UnicodeMode,
UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
ClassContents [UnicodeMode,
UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
ClassAtom [UnicodeMode]
::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode]
::
SourceCharacter
but not one of \ or ] or
-
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode]
::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression
::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection
::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
참고 1
여기서 처음 두 줄은 CharacterClass와 동일하다.
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents
::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter
::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter
but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator
:: one of &&
!! ## $$ %%
** ++ ,, ..
:: ;; << ==
>> ?? @@ ^^
`` ~~
ClassSetSyntaxCharacter
:: one of (
) [ ] { }
/ - \ |
ClassSetReservedPunctuator
:: one of &
- ! # % ,
: ; < =
> @ ` ~
참고 2
이 섹션의 여러 생성식(production)은 B.1.2 섹션에서
대체 정의가 제공된다.
22.2.1.1 정적 의미론: 초기 에러
참고
Pattern :: Disjunction
QuantifierPrefix
::
{
DecimalDigits
,
DecimalDigits
}
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
AtomEscape ::
k
GroupName
AtomEscape ::
DecimalEscape
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
RegExpIdentifierStart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
CharacterClassEscape
::
P{
UnicodePropertyValueExpression
}
CharacterClass ::
[^
ClassContents
]
NestedClass ::
[^
ClassContents
]
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
22.2.1.2 정적 의미론: CountLeftCapturingParensWithin (
node )
CountLeftCapturingParensWithin 추상 연산은 node (파싱 노드 )를 인수로 받고, 0 이상의
정수 를 반환한다.
node 내의 왼쪽 캡처 괄호 개수를 반환한다. 왼쪽 캡처 괄호 란,
Atom ::
(
GroupSpecifier opt
Disjunction
)
생성식에서 매치되는 모든 ( 패턴 문자이다.
참고
호출 시 다음 단계를 수행한다:
Assert :
node 는 RegExp 패턴 문법 의 생성식 인스턴스이다.
node 내에 포함된
Atom ::
(
GroupSpecifier opt
Disjunction
)
파싱 노드 개수를 반환한다.
22.2.1.3 정적 의미론: CountLeftCapturingParensBefore (
node )
CountLeftCapturingParensBefore 추상 연산은 node (파싱 노드 )를 인수로 받고, 0 이상의
정수 를 반환한다.
node 를 둘러싼 패턴 내에서 node 의 왼쪽에 위치하는 왼쪽 캡처 괄호 개수를 반환한다.
참고
호출 시 다음 단계를 수행한다:
Assert :
node 는 RegExp 패턴 문법 의 생성식 인스턴스이다.
pattern 에 node 를 포함하는 Pattern 을 할당한다.
pattern 내에서 node 의 앞에 위치하거나 node 를 포함하는
Atom ::
(
GroupSpecifier opt
Disjunction
)
파싱 노드 개수를 반환한다.
22.2.1.4 정적 의미론: MightBothParticipate ( x ,
y )
MightBothParticipate 추상 연산은 x (파싱 노드 )와
y (파싱 노드 )를 인수로 받고, Boolean 값을 반환한다. 호출 시
다음 단계를 수행한다:
Assert :
x 와 y 는 동일한 Pattern 으로 둘러싸여 있다.
둘러싸고 있는 Pattern 에
Disjunction
::
Alternative
|
Disjunction
파싱 노드 가 존재하고, x 가
Alternative 내에 포함되어
있고 y 가 파생된 Disjunction 내에 포함되어 있거나, x 가
파생된 Disjunction 내에
포함되어 있고 y 가 Alternative 내에 포함되어 있으면
false 를 반환한다.
true 를 반환한다.
22.2.1.5 정적 의미론: CapturingGroupNumber
구문 지향 연산
CapturingGroupNumber는 인수를 받지 않고 양의 정수 를 반환한다.
참고
다음 생성식에 대해 개별적으로 정의된다:
DecimalEscape ::
NonZeroDigit
NonZeroDigit 의 MV를
반환한다.
DecimalEscape ::
NonZeroDigit
DecimalDigits
n 에 DecimalDigits 의 코드 포인트 개수를 할당한다.
(NonZeroDigit 의 MV
×
10n + DecimalDigits 의 MV)을 반환한다.
“NonZeroDigit 의 MV” 및
“DecimalDigits 의 MV”의 정의는
12.9.3 에 있다.
22.2.1.6 정적 의미론: IsCharacterClass
구문 지향 연산
IsCharacterClass는 인수를 받지 않고 Boolean 값을 반환한다.
참고
다음 생성식에 대해 개별적으로 정의된다:
ClassAtom ::
-
ClassAtomNoDash
::
SourceCharacter
but not one of \ or ] or
-
ClassEscape ::
b
-
CharacterEscape
false 를 반환한다.
ClassEscape ::
CharacterClassEscape
true 를 반환한다.
22.2.1.7 정적 의미론: CharacterValue
구문 지향 연산
CharacterValue는 인수를 받지 않으며, 0 이상의 정수 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
ClassAtom :: -
U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
ClassAtomNoDash
:: SourceCharacter
but not one of \ or ] or
-
ch 에 SourceCharacter 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassEscape ::
b
U+0008(BACKSPACE)의 숫자 값을 반환한다.
ClassEscape ::
U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
CharacterEscape
:: ControlEscape
표 67 에 따라 숫자 값을
반환한다.
표 67: ControlEscape 코드 포인트 값
ControlEscape
숫자 값
코드 포인트
유니코드 이름
기호
t
9
U+0009
CHARACTER TABULATION
<HT>
n
10
U+000A
LINE FEED (LF)
<LF>
v
11
U+000B
LINE TABULATION
<VT>
f
12
U+000C
FORM FEED (FF)
<FF>
r
13
U+000D
CARRIAGE RETURN (CR)
<CR>
CharacterEscape
::
c
AsciiLetter
ch 에 AsciiLetter 가 매치한 코드 포인트를 할당한다.
i 에 ch 의 숫자 값을 할당한다.
i 를 32로 나눈 나머지를 반환한다.
CharacterEscape
::
0
[lookahead ∉ DecimalDigit ]
U+0000(NULL)의 숫자 값을 반환한다.
참고 2
\0은 <NUL> 문자를 나타내며, 뒤에 십진수 숫자가 올 수 없다.
CharacterEscape
:: HexEscapeSequence
HexEscapeSequence 의 MV를 반환한다.
RegExpUnicodeEscapeSequence
::
u
HexLeadSurrogate
\u
HexTrailSurrogate
lead 에 HexLeadSurrogate 의 CharacterValue 를
할당한다.
trail 에 HexTrailSurrogate 의 CharacterValue 를
할당한다.
cp 에 UTF16SurrogatePairToCodePoint (lead ,
trail )를 할당한다.
cp 의 숫자 값을 반환한다.
RegExpUnicodeEscapeSequence
::
u
Hex4Digits
Hex4Digits 의 MV를
반환한다.
RegExpUnicodeEscapeSequence
::
u{
CodePoint
}
CodePoint 의 MV를 반환한다.
HexLeadSurrogate
:: Hex4Digits
HexTrailSurrogate
:: Hex4Digits
HexNonSurrogate
:: Hex4Digits
Hex4Digits 의 MV를
반환한다.
CharacterEscape
:: IdentityEscape
ch 에 IdentityEscape 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
:: SourceCharacter
but not ClassSetSyntaxCharacter
ch 에 SourceCharacter 가 매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
::
\
ClassSetReservedPunctuator
ch 에 ClassSetReservedPunctuator 가
매치한 코드 포인트를 할당한다.
ch 의 숫자 값을 반환한다.
ClassSetCharacter
:: \b
U+0008(BACKSPACE)의 숫자 값을 반환한다.
22.2.1.8 정적 의미론: MayContainStrings
구문 지향 연산
MayContainStrings는 인수를 받지 않으며 Boolean 값을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
CharacterClassEscape
::
d
D
s
S
w
W
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
NestedClass ::
[^
ClassContents
]
ClassContents ::
[empty]
NonemptyClassRanges
ClassSetOperand
::
ClassSetCharacter
false 를 반환한다.
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
LoneUnicodePropertyNameOrValue 가
표 71 의
"Property name" 열에 나열된 문자열의 바이너리 프로퍼티인 경우 true 를 반환한다.
false 를 반환한다.
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassUnion 가 존재하면,
MayContainStrings 를
ClassUnion 에 대해 반환한다.
false 를 반환한다.
ClassUnion ::
ClassSetOperand
ClassUnion opt
MayContainStrings 가
ClassSetOperand 에 대해
true 이면 true 를 반환한다.
ClassUnion 가 존재하면,
MayContainStrings 를
ClassUnion 에 대해 반환한다.
false 를 반환한다.
ClassIntersection
::
ClassSetOperand
&&
ClassSetOperand
첫 번째 MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
두 번째 MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
true 를 반환한다.
ClassIntersection
::
ClassIntersection
&&
ClassSetOperand
MayContainStrings 가
ClassIntersection 에 대해
false 이면 false 를 반환한다.
MayContainStrings 가
ClassSetOperand 에 대해
false 이면 false 를 반환한다.
true 를 반환한다.
ClassSubtraction
::
ClassSetOperand
--
ClassSetOperand
첫 번째 MayContainStrings 를
ClassSetOperand 에 대해 반환한다.
ClassSubtraction
::
ClassSubtraction
--
ClassSetOperand
MayContainStrings 를
ClassSubtraction 에 대해 반환한다.
ClassStringDisjunctionContents
::
ClassString
|
ClassStringDisjunctionContents
MayContainStrings 가
ClassString 에 대해
true 이면 true 를 반환한다.
MayContainStrings 를
ClassStringDisjunctionContents 에
대해 반환한다.
ClassString ::
[empty]
true 를 반환한다.
ClassString ::
NonEmptyClassString
MayContainStrings 를
NonEmptyClassString 에 대해 반환한다.
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
NonEmptyClassString 가 존재하면
true 를 반환한다.
false 를 반환한다.
22.2.1.9 정적 의미론: GroupSpecifiersThatMatch (
thisGroupName )
GroupSpecifiersThatMatch 추상 연산은 thisGroupName (GroupName 파싱
노드 )를 인수로 받고, List
타입의 GroupSpecifier
파싱
노드 리스트를 반환한다. 호출 시 다음 단계를 수행한다:
name 에 CapturingGroupName
of thisGroupName 를 할당한다.
pattern 에 thisGroupName 을 포함하는 Pattern 을 할당한다.
result 에 새로운 빈 List 를 할당한다.
pattern 이 포함하는 각 GroupSpecifier gs 에 대해
반복한다:
gs 의 CapturingGroupName
이 name 과 같으면,
gs 를 result 에 추가한다.
result 를 반환한다.
22.2.1.10 정적 의미론: CapturingGroupName
구문 지향 연산
CapturingGroupName은 인수를 받지 않으며 문자열을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
GroupName ::
<
RegExpIdentifierName
>
idTextUnescaped 에 RegExpIdentifierName 의
RegExpIdentifierCodePoints 를
할당한다.
CodePointsToString (idTextUnescaped )을
반환한다.
22.2.1.11 정적 의미론: RegExpIdentifierCodePoints
구문 지향 연산
RegExpIdentifierCodePoints는 인수를 받지 않으며 코드 포인트 List 를 반환한다. 다음 생성식에 대해
개별적으로 정의된다:
RegExpIdentifierName
:: RegExpIdentifierStart
cp 에 RegExpIdentifierStart 의
RegExpIdentifierCodePoint 를
할당한다.
« cp »를 반환한다.
RegExpIdentifierName
::
RegExpIdentifierName
RegExpIdentifierPart
cps 에 파생된 RegExpIdentifierName 의
RegExpIdentifierCodePoints 를
할당한다.
cp 에 RegExpIdentifierPart 의
RegExpIdentifierCodePoint 를
할당한다.
cps 와 « cp »의 리스트 연결 을 반환한다.
22.2.1.12 정적 의미론: RegExpIdentifierCodePoint
구문 지향 연산
RegExpIdentifierCodePoint는 인수를 받지 않으며 코드 포인트를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
RegExpIdentifierStart
:: IdentifierStartChar
IdentifierStartChar 가 매치한 코드
포인트를 반환한다.
RegExpIdentifierPart
:: IdentifierPartChar
IdentifierPartChar 가 매치한 코드 포인트를
반환한다.
RegExpIdentifierStart
::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart
::
\
RegExpUnicodeEscapeSequence
RegExpUnicodeEscapeSequence 의
CharacterValue 의
숫자 값을 가진 코드 포인트를 반환한다.
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
lead 에 UnicodeLeadSurrogate 가 매치한 코드
포인트의 숫자 값인 코드 유닛을 할당한다.
trail 에 UnicodeTrailSurrogate 가 매치한
코드 포인트의 숫자 값인 코드 유닛을 할당한다.
UTF16SurrogatePairToCodePoint (lead ,
trail )을 반환한다.
22.2.2 패턴 의미론
정규 표현식 패턴은 아래에 설명된 과정을 사용하여 추상 클로저 로 변환된다. 구현체는 결과가 동일하다면 아래에 나열된 알고리즘보다
더 효율적인 알고리즘을 사용하는 것이 권장된다. 추상 클로저 는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯의 값으로 사용된다.
Pattern 은 연관된 플래그에 u나
v가 모두 없으면 BMP 패턴이다. 그렇지 않으면 유니코드 패턴이다. BMP 패턴은 기본 다국어 평면 범위 내의 16비트 값 시퀀스로 해석된 문자열에
대해 매칭을 수행한다. 유니코드 패턴은 UTF-16으로 인코딩된 유니코드 코드 포인트 시퀀스로 해석된 문자열에 대해 매칭을 수행한다. BMP 패턴의 동작을 설명하는 문맥에서
“문자”란 16비트 유니코드 BMP 코드 포인트 하나를 의미한다. 유니코드 패턴의 동작을 설명하는 문맥에서 “문자”란 UTF-16 인코딩된 코드 포인트(6.1.4 )를 의미한다. 두 경우 모두
“문자 값”이란 해당 비인코딩 코드 포인트의 숫자 값을 뜻한다.
Pattern 의 문법과 의미론은 Pattern 의 소스 텍스트가 각각 List 타입의 SourceCharacter 값들로 구성된 것으로
정의된다. 각 SourceCharacter 는
하나의 유니코드 코드 포인트에 대응한다. 만약 BMP 패턴에 비BMP SourceCharacter 가 포함된 경우 전체 패턴은 UTF-16으로 인코딩되고,
그 인코딩의 개별 코드 유닛이 List 의 요소로 사용된다.
참고
예를 들어, 소스 텍스트에서 단일 비BMP 문자 U+1D11E(MUSICAL SYMBOL G CLEF)로 표현된 패턴을 생각해보자. 유니코드 패턴으로 해석하면,
이는 단일 코드 포인트 U+1D11E로 구성된 단일 요소(문자) List 가 된다. 하지만 BMP
패턴으로 해석하면, 먼저 UTF-16으로 인코딩되어 코드 유닛 0xD834와 0xDD1E로 구성된 두 요소 List 가 된다.
패턴은 RegExp 생성자 에 ECMAScript 문자열 값으로 전달되며, 비BMP 문자는
UTF-16으로 인코딩되어 있다. 예를 들어, 단일 문자 MUSICAL SYMBOL G CLEF 패턴은 문자열 값으로 표현하면 문자열 길이 2이고, 요소는
코드 유닛 0xD834와 0xDD1E이다. 따라서 BMP 패턴으로 두 패턴 문자로 처리하는 데 추가 변환이 필요하지 않다. 하지만 유니코드 패턴으로 처리하려면
UTF16SurrogatePairToCodePoint 를
사용해 단일 패턴 문자(코드 포인트 U+1D11E)만을 요소로 가지는 List 를 생성해야 한다.
구현체는 실제로 이러한 UTF-16 변환을 수행하지 않을 수도 있지만, 이 명세의 의미론은 패턴 매칭 결과가 이러한 변환이 수행된 것과 같아야 함을 요구한다.
22.2.2.1 표기법
아래 설명에서는 다음 내부 데이터 구조를 사용합니다:
CharSetElement 는 다음 두 가지 중 하나입니다:
rer .[[UnicodeSets]] 가
false 인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자입니다.
rer .[[UnicodeSets]] 가
true 인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자로 이루어진 시퀀스입니다.
여기에는 빈 시퀀스, 한 글자의 시퀀스, 두 글자 이상의 시퀀스가 포함됩니다. 편의를 위해, 이러한 종류의 CharSetElement를 다룰
때, 개별 문자는 한 글자 시퀀스와 동등하게 취급됩니다.
CharSet 은
CharSetElement의 수학적 집합입니다.
CaptureRange 는 Record { [[StartIndex]] , [[EndIndex]] }로, 캡처에
포함된 문자 범위를 나타냅니다. [[StartIndex]] 는 Input 내 범위의 시작
인덱스(포함)를 나타내는 정수 이고, [[EndIndex]] 는
Input 내 범위의 끝 인덱스(미포함)를 나타내는 정수 입니다. 어떤 CaptureRange 에 대해서도, 이
인덱스들은 [[StartIndex]] ≤ [[EndIndex]]
불변식을 만족해야 합니다.
MatchState 는 Record { [[Input]] , [[EndIndex]] , [[Captures]] }로, [[Input]] 는 매칭되는 문자열을
나타내는 문자 List , [[EndIndex]] 는 정수 , [[Captures]] 는 패턴 내의
왼쪽 캡처 괄호 마다 하나씩의 값을 가지는
List 입니다. MatchStates 는 정규 표현식 매칭 알고리즘에서 부분 매칭
상태를 나타내는 데 사용됩니다. [[EndIndex]] 는 패턴이 지금까지 매치한 마지막 입력 문자 인덱스에 1을
더한 값이며, [[Captures]] 는 캡처 괄호의 결과를 저장합니다.
n 번째 [[Captures]] 요소는
n 번째 캡처 괄호에서 캡처된 문자 범위를 나타내는 CaptureRange 이거나, 해당
캡처 괄호에 아직 도달하지 않은 경우 undefined 입니다. 백트래킹 때문에 매칭 과정 중에는 여러 MatchStates 가 동시에 사용될 수 있습니다.
MatcherContinuation 은 추상 클로저 로, 하나의
MatchState 인수를 받고 MatchState 또는
failure 를 반환합니다. MatcherContinuation 은 클로저의 캡처
값에 의해 지정된 패턴의 나머지 부분을 Input 에 대해, 주어진 MatchState 중간 상태부터 매칭을
시도합니다. 매칭에 성공하면 MatcherContinuation 은 도달한 최종
MatchState 를 반환하고, 실패하면 MatcherContinuation 은
failure 를 반환합니다.
Matcher 는 추상
클로저 로, 두 개의 인수—MatchState 와 MatcherContinuation —를 받아
MatchState 또는
failure 를 반환합니다. Matcher 는 클로저의 캡처 값에 의해 지정된
패턴의 중간 부분을 MatchState 의 [[Input]] 에 대해 주어진 MatchState 중간 상태부터 매칭을
시도합니다. MatcherContinuation 인수는 패턴의
나머지 부분을 매칭하는 클로저여야 합니다. 패턴의 중간 부분을 매칭하여 새로운 MatchState 를 얻은 후,
Matcher 는 그 새로운 MatchState 에 대해 MatcherContinuation 을 호출하여 패턴의
나머지 부분도 매칭 가능한지 확인합니다. 가능하면 Matcher 는 MatchState 를 MatcherContinuation 에서 반환된 값을
그대로 반환합니다. 그렇지 않으면 Matcher 는 선택 지점에서 다른 선택을 시도하며 MatcherContinuation 를 반복적으로
호출하여 성공하거나 모든 가능성을 소진할 때까지 진행합니다.
22.2.2.1.1 RegExp 레코드
RegExp 레코드 는 컴파일 중과 매칭 중에 필요할 수 있는
RegExp에 대한 정보를 저장하는 데 사용되는 Record 값입니다.
다음 필드를 가집니다:
표 68: RegExp 레코드 필드
필드 이름
값
의미
[[IgnoreCase]]
Boolean
RegExp의 플래그에 "i" 가 포함되어 있는지 나타냄
[[Multiline]]
Boolean
RegExp의 플래그에 "m" 가 포함되어 있는지 나타냄
[[DotAll]]
Boolean
RegExp의 플래그에 "s" 가 포함되어 있는지 나타냄
[[Unicode]]
Boolean
RegExp의 플래그에 "u" 가 포함되어 있는지 나타냄
[[UnicodeSets]]
Boolean
RegExp의 플래그에 "v" 가 포함되어 있는지 나타냄
[[CapturingGroupsCount]]
0 이상의 정수
RegExp 패턴 내 왼쪽
캡처 괄호 의 개수
22.2.2.2 실행 시 의미론: CompilePattern
구문 지향 연산
CompilePattern은 rer (RegExp
레코드 )를 인수로 받고, 문자 List 와 0 이상의 정수 를 인수로 받아 MatchState 또는
failure 를 반환하는 추상 클로저 를 반환한다. 다음 생성식에 대해
개별적으로 정의된다:
Pattern :: Disjunction
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (Input , index ) 파라미터를 가지며
rer 와 m 을 캡처하는 새로운 추상 클로저 를 반환한다:
Assert : Input 은 문자 List 이다.
Assert : 0 ≤ index ≤
Input 의 요소 개수이다.
c 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
cap 에 rer .[[CapturingGroupsCount]] 개의
undefined 값을 가지는 List 를
인덱스 1부터 rer .[[CapturingGroupsCount]] 까지
할당한다.
x 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : index , [[Captures]] : cap }를 할당한다.
m (x , c )를 반환한다.
참고
패턴은 추상 클로저 값으로 컴파일된다.
RegExpBuiltinExec 는 이 절차를 문자
List 와 그
List 내의 오프셋에
적용해, 해당 오프셋에서 패턴이 정확히 매치되는지, 매치된다면 캡처 괄호의 값이 무엇인지 결정할 수 있다. 22.2.2 의 알고리즘은 패턴 컴파일 시
SyntaxError 예외를 던질 수 있도록 설계되어 있다. 하지만 패턴이 성공적으로 컴파일된 뒤에는, 결과로 얻은
추상 클로저 를 문자 List 에서 매치를 찾기
위해 적용했을 때 예외가 발생할 수 없다(단, 어디서든 발생 가능한 구현 정의 예외, 예를 들어
메모리 부족 등은 제외).
22.2.2.3 실행 시 의미론: CompileSubpattern
구문 지향 연산
CompileSubpattern은 rer (RegExp 레코드 )와
direction (forward 또는 backward )를 인수로
받고 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Disjunction ::
Alternative
|
Disjunction
m1 에 CompileSubpattern 을 Alternative 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
m2 에 CompileSubpattern 을 Disjunction 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
MatchTwoAlternatives (m1 ,
m2 )를 반환한다.
참고 2
| 정규 표현식 연산자는 두 가지 대안을 구분한다. 패턴은 먼저 왼쪽 Alternative (그리고 그 뒤의 정규 표현식)를 매칭 시도한다.
실패하면 오른쪽 Disjunction (그리고 그 뒤의 정규 표현식)를 시도한다. 왼쪽
Alternative , 오른쪽
Disjunction , 그리고 그
뒤의 정규 표현식 모두 선택 지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 왼쪽 Alternative 의 다음 선택으로 넘어간다. 왼쪽 Alternative 의 선택이 모두
소진되면, 왼쪽 Alternative 대신 오른쪽 Disjunction 을 시도한다.
|로 건너뛴 패턴 부분의 캡처 괄호는 문자열 대신 undefined 값을 생성한다. 예를
들어,
/a|ab/.exec ("abc" )
의 결과는 "a" 이고 "ab" 가 아니다. 또,
/((a)|(ab))((c)|(bc))/.exec ("abc" )
의 결과 배열은
["abc" , "a" , "a" , undefined , "bc" , undefined , "bc" ]
이고,
["abc" , "ab" , undefined , "ab" , "c" , "c" , undefined ]
는 아니다.
두 대안의 시도 순서는 direction 값과 무관하다.
Alternative ::
[empty]
EmptyMatcher ()를 반환한다.
Alternative ::
Alternative
Term
m1 에 CompileSubpattern 을 Alternative 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
m2 에 CompileSubpattern 을 Term 에 rer 와
direction 을 인수로 호출한 결과를 할당한다.
MatchSequence (m1 ,
m2 , direction )를 반환한다.
참고 3
연속된 Term 들은
Input 의 연속된 부분을 동시에 매칭 시도한다. direction 이
forward 인 경우, 왼쪽 Alternative , 오른쪽 Term , 그리고 그 뒤의 정규 표현식 모두 선택
지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 오른쪽 Term 의 다음 선택으로 넘어가고, 오른쪽 Term 의 모든 선택이 끝나면 왼쪽 Alternative 의 다음 선택으로
넘어간다. direction 이 backward 인 경우, Alternative 와 Term 의 평가 순서가 반대가 된다.
Term :: Assertion
CompileAssertion 을 Assertion 에
rer 를 인수로 호출한 결과를 반환한다.
참고 4
결과 Matcher 는 direction 과 무관하다.
Term :: Atom
CompileAtom 을 Atom 에 rer 와
direction 을 인수로 호출한 결과를 반환한다.
Term ::
Atom
Quantifier
m 에 CompileAtom 을 Atom 에 rer 와
direction 을 인수로 호출한 결과를 할당한다.
q 에 CompileQuantifier 을 Quantifier 에 대해 호출한 결과를
할당한다.
Assert :
q .[[Min]] ≤ q .[[Max]] .
parenIndex 에 CountLeftCapturingParensBefore (Term )의 결과를 할당한다.
parenCount 에 CountLeftCapturingParensWithin (Atom )의 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m ,
q , parenIndex , parenCount 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
RepeatMatcher (m ,
q .[[Min]] , q .[[Max]] , q .[[Greedy]] , x , c ,
parenIndex , parenCount )를 반환한다.
22.2.2.3.1 RepeatMatcher ( m , min ,
max , greedy , x , c , parenIndex ,
parenCount )
RepeatMatcher 추상 연산은 m (Matcher ), min (0 이상의 정수 ),
max (0 이상의 정수 또는 +∞), greedy (Boolean),
x (MatchState ), c (MatcherContinuation ),
parenIndex (0 이상의 정수 ), parenCount (0 이상의 정수 )를 인수로 받고
MatchState 또는
failure 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 max = 0이면, c (x )를 반환한다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며 m ,
min , max , greedy , x , c ,
parenIndex , parenCount 를 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert : y 는 MatchState 이다.
만약 min = 0이고 y .[[EndIndex]] = x .[[EndIndex]] 이면, failure 를
반환한다.
만약 min = 0이면 min2 는 0, 아니면 min2 는
min - 1로 한다.
만약 max = +∞이면 max2 는 +∞, 아니면 max2 는
max - 1로 한다.
RepeatMatcher (m ,
min2 , max2 , greedy , y ,
c , parenIndex , parenCount )를 반환한다.
cap 에 x .[[Captures]] 의 복사본을 할당한다.
각 정수 k 에 대해
포함 구간 parenIndex +
1부터 parenIndex + parenCount 까지 반복하며,
cap [k ]에 undefined 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
xr 에 MatchState { [[Input]] : Input , [[EndIndex]] : e , [[Captures]] : cap }를 할당한다.
만약 min ≠ 0이면, m (xr , d )를 반환한다.
만약 greedy 가 false 이면,
z 에 c (x )를 할당한다.
z 가 failure 가 아니면 z 를 반환한다.
m (xr , d )를 반환한다.
z 에 m (xr , d )를 할당한다.
z 가 failure 가 아니면 z 를 반환한다.
c (x )를 반환한다.
참고 1
Atom 뒤에 Quantifier 가 오면,
Quantifier 가 지정한
횟수만큼 반복된다. Quantifier 는 비탐욕적일 수 있는데 이 경우
Atom 패턴을 가능한 적게 반복하며,
아니면 탐욕적일 경우 Atom 패턴을
가능한 많이 반복한다. Atom 패턴이
반복되는 것이며, 매치되는 입력 문자 시퀀스가 반복되는 것이 아니므로, Atom 의 각 반복은 서로 다른 입력 부분 문자열을 매치할 수 있다.
참고 2
Atom 와 그 뒤의 정규 표현식 모두 선택
지점이 있으면, Atom 을 먼저 가능한
많이(또는 비탐욕적이면 적게) 반복한다. 그 뒤의 모든 선택을 먼저 시도한 다음 마지막 Atom 반복의 다음 선택으로 넘어간다.
마지막(n번째 ) Atom 반복의 모든 선택이 끝나면, 그 다음은 마지막에서 두
번째(n-1)번째 Atom 반복의 다음 선택으로 넘어간다. 반복 횟수가 더 많거나 적게
가능한 경우, 위 순서대로 모두 소진한 뒤 이전 반복으로 넘어간다.
비교 예시:
/a[a-z]{2 ,4 }/.exec ("abcdefghi" )
결과는 "abcde" 이고
/a[a-z]{2 ,4 }?/.exec ("abcdefghi" )
결과는 "abc" 이다.
또한 다음을 보라:
/(aa|aabaac|ba|b|c)*/.exec ("aabaac" )
위의 선택 순서에 따라 결과 배열은
["aaba" , "ba" ]
이고, 아래는 아니다:
["aabaac" , "aabaac" ]
["aabaac" , "c" ]
위와 같은 선택 순서는 정규 표현식을 사용해 두 수의 최대공약수를 계산할 수도 있다(단항 표기 사용). 예를 들어 10과 15의 최대공약수 계산은
아래와 같다:
"aaaaaaaaaa,aaaaaaaaaaaaaaa" .replace (/^(a+)\1*,\1+$/ , "$1" )
결과는 단항 표기로 "aaaaa" 이다.
참고 3
RepeatMatcher의 4
단계는 Atom 의 캡처를 반복될 때마다
초기화한다. 아래 예시에서 그 동작을 확인할 수 있다:
/(z)((a+)?(b+)?(c))*/.exec ("zaacbbbcac" )
결과 배열은
["zaacbbbcac" , "z" , "ac" , "a" , undefined , "c" ]
이고,
["zaacbbbcac" , "z" , "ac" , "a" , "bbb" , "c" ]
는 아니다. 이는 바깥 *의 각 반복에서 수량자가 포함하는 Atom 의 모든 캡처 문자열(여기서는 2, 3, 4, 5번)이 초기화되기
때문이다.
참고 4
RepeatMatcher의 2.b 단계는 최솟값 반복을 만족한 뒤에는,
빈 문자열을 매치하는 반복은 더 이상 시도하지 않는다고 명시한다. 이는 아래와 같은 패턴에서 정규 표현식 엔진이 무한루프에 빠지는 것을
방지한다:
/(a*)*/.exec ("b" )
혹은 다음과 같이 조금 더 복잡한 경우에도:
/(a*)b\1 +/.exec ("baaaac" )
결과 배열은
["b" , "" ]
22.2.2.3.2 EmptyMatcher ( )
EmptyMatcher 추상 연산은 인수를 받지 않으며 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 아무것도 캡처하지 않는 새로운
Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
c (x )를 반환한다.
22.2.2.3.3 MatchTwoAlternatives ( m1 ,
m2 )
MatchTwoAlternatives 추상 연산은 m1 (Matcher )와
m2 (Matcher )를 인수로 받아 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m1 과
m2 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
r 에 m1 (x , c )를 할당한다.
r 가 failure 가 아니면 r 를 반환한다.
m2 (x , c )를 반환한다.
22.2.2.3.4 MatchSequence ( m1 , m2 ,
direction )
MatchSequence 추상 연산은 m1 (Matcher ), m2 (Matcher ),
direction (forward 또는 backward )를
인수로 받아 Matcher 를 반환한다. 호출 시 다음 단계를 수행한다:
만약 direction 이 forward 라면,
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
m1 과 m2 를 캡처하는 새로운 Matcher 를
반환한다:
Assert : x 는
MatchState 이다.
Assert : c 는
MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
c 와 m2 를 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert :
y 는 MatchState 이다.
m2 (y , c )를 반환한다.
m1 (x , d )를 반환한다.
그 외의 경우,
Assert : direction 은
backward 이다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
m1 과 m2 를 캡처하는 새로운 Matcher 를
반환한다:
Assert : x 는
MatchState 이다.
Assert : c 는
MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
c 와 m1 을 캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert :
y 는 MatchState 이다.
m1 (y , c )를 반환한다.
m2 (x , d )를 반환한다.
22.2.2.4 실행 시 의미론: CompileAssertion
구문 지향 연산
CompileAssertion은 rer (RegExp
레코드 )를 인수로 받아 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Assertion :: ^
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
만약 e = 0이거나, rer .[[Multiline]] 가 true 이고
Input [e - 1]이 LineTerminator 에 매치되면,
c (x )를 반환한다.
failure 를 반환한다.
참고 2
y 플래그가 사용되어도, ^는 항상 Input 의 시작
또는(rer .[[Multiline]] 가 true 이면)
줄의 시작에서만 매치된다.
Assertion :: $
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
만약 e = InputLength 이거나, rer .[[Multiline]] 가 true 이고
Input [e ]이 LineTerminator 에 매치되면,
c (x )를 반환한다.
failure 를 반환한다.
Assertion :: \b
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
a 에 IsWordChar (rer ,
Input , e - 1)을 할당한다.
b 에 IsWordChar (rer ,
Input , e )를 할당한다.
만약 a 가 true 이고 b 가
false 이거나, a 가 false 이고
b 가 true 이면 c (x )를 반환한다.
failure 를 반환한다.
Assertion :: \B
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
a 에 IsWordChar (rer ,
Input , e - 1)을 할당한다.
b 에 IsWordChar (rer ,
Input , e )를 할당한다.
만약 a 가 true 이고 b 가
true 이거나, a 가 false 이고
b 가 false 이면 c (x )를 반환한다.
failure 를 반환한다.
Assertion ::
(?=
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 이면
failure 를 반환한다.
Assert : r 는 MatchState 이다.
cap 에 r .[[Captures]] 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
xe 에 x .[[EndIndex]] 를 할당한다.
z 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
참고 3
(?= Disjunction ) 형식은 0폭 양수
전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되어야 하지만,
현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction 이 현재 위치에서 여러 방식으로 매치 가능해도 첫
번째 방식만 시도된다. 다른 정규식 연산자와 달리 (?= 형식에는 백트래킹이 없다(이런 특이한 동작은 Perl에서 유래). 이는
Disjunction 에 캡처 괄호가
있고, 패턴의 뒤에 해당 캡처를 참조하는 경우에만 영향을 미친다.
예시:
/(?=(a+))/.exec ("baaabac" )
은 첫 번째 b 바로 뒤에서 빈 문자열을 매치하고, 결과 배열은:
["" , "aaa" ]
전방탐색 내부에 백트래킹이 없음을 보여주기 위해 다음을 보라:
/(?=(a+))a*b\1 /.exec ("baaabac" )
이 식의 결과는
["aba" , "a" ]
이고, 아래는 아니다:
["aaaba" , "a" ]
Assertion ::
(?!
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 forward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 가 아니면
failure 를 반환한다.
c (x )를 반환한다.
참고 4
(?! Disjunction ) 형식은 0폭 음수
전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되지 않아야
한다. 현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction 에는 캡처 괄호를 포함할 수 있는데, 이 괄호에
대한 역참조는 Disjunction
내부에서만 의미가 있다. 패턴의 다른 곳에서 이 캡처 괄호를 참조하면 항상 undefined 를 반환하므로, 음수
전방탐색이 실패해야 패턴이 성공한다. 예를 들어,
/(.*?)a (?!(a+)b\2c)\2 (.*)/.exec ("baaabaac" )
은 a 바로 뒤에 임의의 개수 n의 a, b, 그 다음 또 n개의
a(첫 번째 \2로 지정), 그리고 c가 오지 않는 a를
찾는다. 두 번째 \2는 음수 전방탐색 바깥에 있으므로 undefined 와 매치되어 항상
성공한다. 전체 표현식의 결과 배열은:
["baaabaac" , "ba" , undefined , "abaac" ]
Assertion ::
(?<=
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 backward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 이면
failure 를 반환한다.
Assert : r 는 MatchState 이다.
cap 에 r .[[Captures]] 를 할당한다.
Input 에 x .[[Input]] 을 할당한다.
xe 에 x .[[EndIndex]] 를 할당한다.
z 에 MatchState
{ [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
Assertion ::
(?<!
Disjunction
)
m 에 CompileSubpattern 을 Disjunction 에
rer 와 backward 를 인수로 호출한 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 m 를 캡처하는
새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y ) 파라미터를 가지는 새로운
MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
y 를 반환한다.
r 에 m (x , d )를 할당한다.
r 가 failure 가 아니면
failure 를 반환한다.
c (x )를 반환한다.
22.2.2.4.1 IsWordChar ( rer , Input ,
e )
IsWordChar 추상 연산은 rer (RegExp
레코드 ), Input (문자 List ),
e (정수 )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
InputLength 에 Input 의 요소 개수를 할당한다.
만약 e = -1 또는 e = InputLength 이면
false 를 반환한다.
c 에 Input [e ] 문자를 할당한다.
만약 WordCharacters (rer )에
c 가 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
22.2.2.5 실행 시 의미론: CompileQuantifier
구문 지향 연산
CompileQuantifier는 인수를 받지 않으며 Record
타입의 [[Min]] (0 이상의 정수 ), [[Max]] (0 이상의 정수 또는 +∞), [[Greedy]] (Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
Quantifier ::
QuantifierPrefix
qp 에 CompileQuantifierPrefix
를 QuantifierPrefix 에 대해 호출한 결과를
할당한다.
Record { [[Min]] : qp .[[Min]] ,
[[Max]] : qp .[[Max]] ,
[[Greedy]] : true }를 반환한다.
Quantifier ::
QuantifierPrefix
?
qp 에 CompileQuantifierPrefix
를 QuantifierPrefix 에 대해 호출한 결과를
할당한다.
Record { [[Min]] : qp .[[Min]] ,
[[Max]] : qp .[[Max]] ,
[[Greedy]] : false }를 반환한다.
22.2.2.6 실행 시 의미론: CompileQuantifierPrefix
구문 지향 연산
CompileQuantifierPrefix는 인수를 받지 않으며 Record
타입의 [[Min]] (0 이상의 정수 ), [[Max]] (0 이상의 정수 또는 +∞) 필드를 반환한다. 다음
생성식에 대해 개별적으로 정의된다:
QuantifierPrefix
:: *
Record { [[Min]] : 0, [[Max]] : +∞ }를
반환한다.
QuantifierPrefix
:: +
Record { [[Min]] : 1, [[Max]] : +∞ }를
반환한다.
QuantifierPrefix
:: ?
Record { [[Min]] : 0, [[Max]] : 1 }를
반환한다.
QuantifierPrefix
::
{
DecimalDigits
}
i 에 DecimalDigits 의 MV를 할당한다(12.9.3 참고).
Record { [[Min]] : i , [[Max]] :
i }를 반환한다.
QuantifierPrefix
::
{
DecimalDigits
,}
i 에 DecimalDigits 의 MV를 할당한다.
Record { [[Min]] : i , [[Max]] :
+∞ }를 반환한다.
QuantifierPrefix
::
{
DecimalDigits
,
DecimalDigits
}
i 에 첫 번째 DecimalDigits 의 MV를 할당한다.
j 에 두 번째 DecimalDigits 의 MV를 할당한다.
Record { [[Min]] : i , [[Max]] :
j }를 반환한다.
22.2.2.7 실행 시 의미론: CompileAtom
구문 지향 연산
CompileAtom은 rer (RegExp
레코드 )와 direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
Atom :: PatternCharacter
ch 에 PatternCharacter 가 매치한 문자를 할당한다.
A 에 문자 ch 를 포함하는 원소 하나짜리 CharSet 을 할당한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
Atom :: .
A 에 AllCharacters (rer )를
할당한다.
rer .[[DotAll]] 이 true 가 아니면,
A 에서 LineTerminator 생성식의 오른쪽에
해당하는 모든 코드 포인트의 문자를 제거한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
Atom :: CharacterClass
cc 에 CompileCharacterClass 를
CharacterClass 에
rer 를 인수로 호출한 결과를 할당한다.
cs 에 cc .[[CharSet]] 을 할당한다.
rer .[[UnicodeSets]] 이
false 이거나, cs 의 모든 CharSetElement 가 한 글자로만 이루어진 경우(빈
집합도 포함), CharacterSetMatcher (rer ,
cs , cc .[[Invert]] ,
direction )을 반환한다.
Assert :
cc .[[Invert]] 는 false 이다.
lm 에 List 타입의 빈
Matchers 리스트를 할당한다.
cs 의 각 CharSetElement s 에 대해,
두 글자 이상인 경우 길이가 긴 것부터 반복하여
cs2 에 s 의 마지막 코드 포인트 하나만을 포함하는 CharSet 를 할당한다.
m2 에 CharacterSetMatcher (rer ,
cs2 , false , direction )를 할당한다.
s 의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1 에 대해 거꾸로 반복하여
cs1 에 c1 을 포함하는 원소 하나짜리 CharSet 를 할당한다.
m1 에 CharacterSetMatcher (rer ,
cs1 , false , direction )를
할당한다.
m2 에 MatchSequence (m1 ,
m2 , direction )를 할당한다.
m2 를 lm 에 추가한다.
singles 에 cs 의 모든 한 글자짜리 CharSetElement 만을
포함하는 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
singles , false , direction )를 lm 에
추가한다.
cs 가 빈 시퀀스를 포함하면, EmptyMatcher ()를 lm 에 추가한다.
m2 에 lm 의 마지막 Matcher 를 할당한다.
lm 의 마지막 전부터 거꾸로 각 Matcher m1 에 대해 반복하여
m2 에 MatchTwoAlternatives (m1 ,
m2 )를 할당한다.
m2 를 반환한다.
Atom ::
(
GroupSpecifier opt
Disjunction
)
m 에 CompileSubpattern 를 Disjunction 에
rer 와 direction 을 인수로 호출한 결과를 할당한다.
parenIndex 에 CountLeftCapturingParensBefore (Atom )의 결과를 할당한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며
direction , m , parenIndex 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
d 에 다음과 같이 호출될 때 아래 단계를 수행하는 (y ) 파라미터를 가지며
x , c , direction , parenIndex 를
캡처하는 새로운 MatcherContinuation 를
할당한다:
Assert : y 는
MatchState 이다.
cap 에 y .[[Captures]] 의
복사본을 할당한다.
Input 에 x .[[Input]] 을
할당한다.
xe 에 x .[[EndIndex]] 를
할당한다.
ye 에 y .[[EndIndex]] 를
할당한다.
direction 이 forward 이면,
Assert : xe
≤ ye .
r 에 CaptureRange
{ [[StartIndex]] : xe ,
[[EndIndex]] : ye }를
할당한다.
그 외의 경우,
Assert :
direction 이 backward 임을
확인한다.
Assert : ye
≤ xe .
r 에 CaptureRange
{ [[StartIndex]] : ye ,
[[EndIndex]] : xe }를
할당한다.
cap [parenIndex + 1]에 r 를 할당한다.
z 에 MatchState { [[Input]] : Input , [[EndIndex]] : ye , [[Captures]] : cap }를 할당한다.
c (z )를 반환한다.
m (x , d )를 반환한다.
참고 2
( Disjunction ) 형태의 괄호는
Disjunction 패턴의
구성요소를 하나로 그룹화함과 동시에 매치 결과를 저장하는 역할을 한다. 매치 결과는 역참조(\ 다음에 0이 아닌 10진수),
치환 문자열에서 참조, 또는 정규표현식 매칭 Abstract Closure 의 배열로 반환될 수 있다.
괄호의 캡처 동작을 방지하려면 (?: Disjunction
) 형태를 사용한다.
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
addModifiers 에 source text
matched by RegularExpressionModifiers 를
할당한다.
removeModifiers 에 빈 문자열을 할당한다.
modifiedRer 에 UpdateModifiers (rer ,
CodePointsToString (addModifiers ),
removeModifiers )를 할당한다.
CompileSubpattern 을 Disjunction 에
modifiedRer 와 direction 을 인수로 호출한 결과를 반환한다.
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
addModifiers 에 source text
matched by 첫 번째 RegularExpressionModifiers 를
할당한다.
removeModifiers 에 source text
matched by 두 번째 RegularExpressionModifiers 를
할당한다.
modifiedRer 에 UpdateModifiers (rer ,
CodePointsToString (addModifiers ),
CodePointsToString (removeModifiers ))를
할당한다.
CompileSubpattern 을 Disjunction 에
modifiedRer 와 direction 을 인수로 호출한 결과를 반환한다.
AtomEscape ::
DecimalEscape
n 에 CapturingGroupNumber
of DecimalEscape 를
할당한다.
Assert :
n ≤ rer .[[CapturingGroupsCount]] 임을
확인한다.
BackreferenceMatcher (rer ,
« n », direction )을 반환한다.
참고 3
\ 뒤에 0이 아닌 10진수가 오는 이스케이프 시퀀스 n 은 n 번째 캡처 괄호의 매치
결과(22.2.2.1 )와 매치된다. 정규표현식에
n 개 미만의 캡처 괄호가 있으면 오류이다. 정규표현식에 n 개 이상의 캡처 괄호가 있지만
n 번째가 아무것도 캡처하지 않아 undefined 인 경우, 역참조는 항상 성공한다.
AtomEscape ::
CharacterEscape
cv 에 CharacterValue
of CharacterEscape 를 할당한다.
ch 에 문자값이 cv 인 문자를 할당한다.
A 에 문자 ch 를 포함하는 원소 하나짜리 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
AtomEscape ::
CharacterClassEscape
cs 에 CompileToCharSet 를 CharacterClassEscape 에
rer 를 인수로 호출한 결과를 할당한다.
rer .[[UnicodeSets]] 가
false 이거나, cs 의 모든 CharSetElement 가 한 글자만으로 이루어진
경우(빈 집합 포함), CharacterSetMatcher (rer ,
cs , false , direction )을 반환한다.
lm 에 List 타입의 빈
Matchers 리스트를 할당한다.
cs 의 각 두 글자 이상 CharSetElement s 에 대해,
길이 내림차순으로 반복하여
cs2 에 s 의 마지막 코드 포인트 하나만을 포함하는 CharSet 를 할당한다.
m2 에 CharacterSetMatcher (rer ,
cs2 , false , direction )를 할당한다.
s 의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1 에 대해 거꾸로 반복하여
cs1 에 c1 을 포함하는 원소 하나짜리 CharSet 를 할당한다.
m1 에 CharacterSetMatcher (rer ,
cs1 , false , direction )를
할당한다.
m2 에 MatchSequence (m1 ,
m2 , direction )를 할당한다.
m2 를 lm 에 추가한다.
singles 에 cs 의 모든 한 글자짜리 CharSetElement 만을
포함하는 CharSet 를 할당한다.
CharacterSetMatcher (rer ,
singles , false , direction )를 lm 에
추가한다.
cs 가 빈 시퀀스를 포함하면, EmptyMatcher ()를 lm 에 추가한다.
m2 에 lm 의 마지막 Matcher 를 할당한다.
lm 의 마지막 전부터 거꾸로 각 Matcher m1 에 대해 반복하여
m2 에 MatchTwoAlternatives (m1 ,
m2 )를 할당한다.
m2 를 반환한다.
AtomEscape ::
k
GroupName
matchingGroupSpecifiers 에 GroupSpecifiersThatMatch (GroupName )를 할당한다.
parenIndices 에 List 타입의 빈
리스트를 할당한다.
matchingGroupSpecifiers 의 각 GroupSpecifier
groupSpecifier 에 대해 반복하여
parenIndex 에 CountLeftCapturingParensBefore (groupSpecifier )의
결과를 할당한다.
parenIndex 를 parenIndices 에 추가한다.
BackreferenceMatcher (rer ,
parenIndices , direction )를 반환한다.
22.2.2.7.1 CharacterSetMatcher ( rer ,
A , invert , direction )
CharacterSetMatcher 추상 연산은 rer (RegExp
레코드 ), A (CharSet ),
invert (Boolean), direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다. 호출 시 다음 단계를
수행한다:
rer .[[UnicodeSets]] 가
true 이면,
Assert : invert 는
false 임을 확인한다.
Assert : A 의 모든 CharSetElement 는 한
글자만으로 이루어져 있어야 한다.
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer ,
A , invert , direction 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
e 에 x .[[EndIndex]] 를 할당한다.
direction 이 forward 이면 f 에
e + 1을 할당한다.
그 외의 경우 f 에 e - 1을 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
f < 0 또는 f > InputLength 이면
failure 를 반환한다.
index 에 min (e , f )를
할당한다.
ch 에 Input [index ] 문자를 할당한다.
cc 에 Canonicalize (rer ,
ch )를 할당한다.
A 에 한 글자만 가진 CharSetElement
a 가 존재하며, Canonicalize (rer ,
a ) == cc 이면 found 를
true 로, 아니면 false 로 한다.
invert 가 false 이고 found 가
false 이면 failure 를 반환한다.
invert 가 true 이고 found 가
true 이면 failure 를 반환한다.
cap 에 x .[[Captures]] 를
할당한다.
y 에 MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap }를 할당한다.
c (y )를 반환한다.
22.2.2.7.2 BackreferenceMatcher ( rer ,
ns , direction )
BackreferenceMatcher 추상 연산은 rer (RegExp
레코드 ), ns (양의 List 타입의 정수 ),
direction (forward 또는
backward )를 인수로 받고 Matcher 를 반환한다. 호출 시 다음 단계를
수행한다:
다음과 같이 호출될 때 아래 단계를 수행하는 (x , c ) 파라미터를 가지며 rer ,
ns , direction 를 캡처하는 새로운 Matcher 를 반환한다:
Assert : x 는 MatchState 이다.
Assert : c 는 MatcherContinuation 이다.
Input 에 x .[[Input]] 을 할당한다.
cap 에 x .[[Captures]] 를
할당한다.
r 에 undefined 를 할당한다.
ns 의 각 정수 n 에 대해 반복하여
cap [n ]이 undefined 가 아니면,
Assert :
r 는 undefined 이어야 한다.
r 에 cap [n ]을 할당한다.
r 가 undefined 이면 c (x )를
반환한다.
e 에 x .[[EndIndex]] 를 할당한다.
rs 에 r .[[StartIndex]] 를
할당한다.
re 에 r .[[EndIndex]] 를 할당한다.
len 에 re - rs 를 할당한다.
direction 이 forward 이면 f 에
e + len 을 할당한다.
그 외의 경우 f 에 e - len 을 할당한다.
InputLength 에 Input 의 요소 개수를 할당한다.
f < 0 또는 f > InputLength 이면
failure 를 반환한다.
g 에 min (e , f )를
할당한다.
0(포함)부터 len (미포함)까지 interval 에서 각
정수 i 에 대해, Canonicalize (rer ,
Input [rs + i ])와 Canonicalize (rer ,
Input [g + i ])가 다르면
failure 를 반환한다.
y 에 MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap }를 할당한다.
c (y )를 반환한다.
22.2.2.7.3 Canonicalize ( rer , ch )
Canonicalize 추상 연산은 rer (RegExp
레코드 )와 ch (문자)를 인수로 받아 문자를 반환한다. 호출 시 다음 단계를 수행한다:
HasEitherUnicodeFlag (rer )
이 true 이고 rer .[[IgnoreCase]] 가 true 이면,
Unicode Character Database의 CaseFolding.txt
파일이 ch 에 대해 simple 또는 common case folding 매핑을 제공하면, 그 매핑을 적용한
결과를 반환한다.
ch 를 반환한다.
rer .[[IgnoreCase]] 가
false 이면 ch 를 반환한다.
Assert : ch 는 UTF-16 코드 유닛이어야 한다.
cp 에 ch 의 숫자값을 가진 코드 포인트를 할당한다.
u 에 Unicode Default Case Conversion 알고리즘에 따라 toUppercase(«
cp »)를 할당한다.
uStr 에 CodePointsToString (u )를
할당한다.
uStr 의 길이가 1이 아니면 ch 를 반환한다.
cu 에 uStr 의 단일 코드 유닛을 할당한다.
ch 의 숫자값이 128 이상이고 cu 의 숫자값이 128 미만이면 ch 를 반환한다.
cu 를 반환한다.
참고
HasEitherUnicodeFlag (rer )
가 true 인 대소문자 구분 없는 매치에서는, 모든 문자가 비교 직전에 Unicode 표준이 제공하는
simple 매핑으로 암묵적으로 케이스 폴딩된다. simple 매핑은 항상 단일 코드 포인트로 매핑하므로, 예를 들어
ß(U+00DF)는 ss 또는 SS로 매핑되지 않는다. 그러나 Basic
Latin 블록 밖의 코드 포인트를 그 안으로 매핑할 수 있다—예를 들어 ſ(U+017F)는
s(U+0073)로, K(U+212A)는 k(U+006B)로 케이스
폴딩된다. 이런 코드 포인트를 포함한 문자열은 /[a-z]/ui 같은 정규표현식으로 매치된다.
HasEitherUnicodeFlag (rer )
가 false 인 대소문자 구분 없는 매치에서는, 매핑이 toCasefold가 아니라 Unicode
Default Case Conversion 알고리즘의 toUppercase 기반이라서 미묘한 차이가 있다. 예를 들어
Ω(U+2126 OHM SIGN)은 toUppercase에선 자기 자신이지만 toCasefold에선
ω(U+03C9 GREEK SMALL LETTER OMEGA)와 Ω(U+03A9 GREEK
CAPITAL LETTER OMEGA)와 함께 매핑되므로, "\u2126" 는
/[ω]/ui와 /[\u03A9]/ui로는 매치되지만 /[ω]/i나
/[\u03A9]/i로는 매치되지 않는다. 또한 Basic Latin 블록 밖의 코드 포인트는 그 안으로 매핑되지
않으므로, "\u017F ſ" 와 "\u212A K" 같은 문자열은
/[a-z]/i로 매치되지 않는다.
22.2.2.7.4 UpdateModifiers ( rer , add ,
remove )
UpdateModifiers 추상 연산은 rer (RegExp
레코드 ), add (문자열), remove (문자열)를 인수로 받아
RegExp 레코드 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : add 와
remove 는 공통되는 요소가 없어야 한다.
ignoreCase 에 rer .[[IgnoreCase]] 를
할당한다.
multiline 에 rer .[[Multiline]] 를
할당한다.
dotAll 에 rer .[[DotAll]] 를 할당한다.
unicode 에 rer .[[Unicode]] 를 할당한다.
unicodeSets 에 rer .[[UnicodeSets]] 를
할당한다.
capturingGroupsCount 에 rer .[[CapturingGroupsCount]] 를 할당한다.
remove 에 "i" 가 포함되어 있으면 ignoreCase 를
false 로 설정한다.
그 외 add 에 "i" 가 포함되어 있으면 ignoreCase 를
true 로 설정한다.
remove 에 "m" 가 포함되어 있으면 multiline 을
false 로 설정한다.
그 외 add 에 "m" 가 포함되어 있으면 multiline 을
true 로 설정한다.
remove 에 "s" 가 포함되어 있으면 dotAll 을
false 로 설정한다.
그 외 add 에 "s" 가 포함되어 있으면 dotAll 을
true 로 설정한다.
RegExp 레코드 { [[IgnoreCase]] : ignoreCase , [[Multiline]] : multiline , [[DotAll]] : dotAll , [[Unicode]] : unicode , [[UnicodeSets]] : unicodeSets , [[CapturingGroupsCount]] :
capturingGroupsCount }를 반환한다.
22.2.2.8 실행 시 의미론: CompileCharacterClass
구문 지향 연산
CompileCharacterClass는 rer (RegExp 레코드 )를 인수로 받고
Record 타입의 [[CharSet]] (CharSet ), [[Invert]] (Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:
CharacterClass ::
[
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
Record { [[CharSet]] : A , [[Invert]] : false }를 반환한다.
CharacterClass ::
[^
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
rer .[[UnicodeSets]] 가
true 이면,
Record
{ [[CharSet]] : CharacterComplement (rer ,
A ), [[Invert]] :
false }를 반환한다.
Record { [[CharSet]] : A , [[Invert]] : true }를 반환한다.
22.2.2.9 실행 시 의미론: CompileToCharSet
구문 지향 연산
CompileToCharSet은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다.
참고 1
다음 생성식에 대해 개별적으로 정의된다:
ClassContents ::
[empty]
빈 CharSet 을 반환한다.
NonemptyClassRanges
::
ClassAtom
NonemptyClassRangesNoDash
A 에 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 NonemptyClassRangesNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
A 에 첫 번째 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
C 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
D 에 CharacterRange (A ,
B )의 결과를 할당한다.
D 와 C 의 합집합을 반환한다.
NonemptyClassRangesNoDash
::
ClassAtomNoDash
NonemptyClassRangesNoDash
A 에 CompileToCharSet 를 ClassAtomNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 NonemptyClassRangesNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
A 에 CompileToCharSet 를 ClassAtomNoDash 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassAtom 에
rer 를 인수로 호출한 결과를 할당한다.
C 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
D 에 CharacterRange (A ,
B )의 결과를 할당한다.
D 와 C 의 합집합을 반환한다.
참고 2
ClassContents 는 한
개의 ClassAtom 또는 대시로
구분된 두 개의 ClassAtom 의
범위로 확장될 수 있다. 후자의 경우 ClassContents 는 첫 번째 ClassAtom 와 두 번째 ClassAtom 사이의 모든 문자를(양끝
포함) 포함한다. 만약 ClassAtom 중 하나가 한 글자가 아니거나(예: \w) 첫 번째
ClassAtom 의 문자값이 두 번째
ClassAtom 의 문자값보다 크면
오류가 발생한다.
참고 3
패턴이 대소문자를 무시하더라도, 범위의 양 끝의 대소문자는 범위에 포함될 문자를 결정하는 데 중요하다. 예를 들어,
/[E-F]/i는 E, F, e,
f만 매치하고, /[E-f]/i는 유니코드 Basic Latin 블록의 모든 대문자·소문자와
[, \, ], ^, _,
` 기호까지 모두 매치한다.
참고 4
- 문자는 리터럴로 처리되거나 범위를 나타낼 수 있다. ClassContents 의 첫 글자 또는 마지막 글자, 범위
명세의 시작 또는 끝, 또는 범위 명세 직후에 오면 리터럴로 처리된다.
ClassAtom :: -
문자 - U+002D(HYPHEN-MINUS)만을 포함하는 CharSet 을 반환한다.
ClassAtomNoDash
:: SourceCharacter
but not one of \ or ] or
-
CharSet 에 SourceCharacter 가 매치한 문자를 포함하여
반환한다.
ClassEscape ::
b
-
CharacterEscape
cv 에 이 CharacterValue
of ClassEscape 의 값을
할당한다.
c 에 문자값이 cv 인 문자를 할당한다.
c 만을 포함하는 CharSet 을 반환한다.
참고 5
ClassAtom 에서는 정규표현식의
나머지 부분에서 허용되는 모든 이스케이프 시퀀스를 사용할 수 있지만 \b, \B, 역참조는 제외한다.
CharacterClass
내부에서 \b는 백스페이스 문자이고 \B 및 역참조는 오류를 발생시킨다. ClassAtom 안에서 역참조를 사용하면
오류가 발생한다.
CharacterClassEscape
:: d
다음 10개 문자 0, 1, 2, 3,
4, 5, 6, 7, 8,
9를 포함하는 CharSet 을 반환한다.
CharacterClassEscape
:: D
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: d
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
:: s
CharSet 에 WhiteSpace 또는 LineTerminator 생성식의
오른쪽에 해당하는 모든 코드 포인트 문자를 포함하여 반환한다.
CharacterClassEscape
:: S
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: s
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
:: w
MaybeSimpleCaseFolding (rer ,
WordCharacters (rer ))를
반환한다.
CharacterClassEscape
:: W
S 에 아래 CharSet 을 할당한다:
CharacterClassEscape
:: w
.
CharacterComplement (rer ,
S )를 반환한다.
CharacterClassEscape
::
p{
UnicodePropertyValueExpression
}
CompileToCharSet 를 UnicodePropertyValueExpression 에
rer 를 인수로 호출한 결과를 반환한다.
CharacterClassEscape
::
P{
UnicodePropertyValueExpression
}
S 에 CompileToCharSet 를 UnicodePropertyValueExpression 에
rer 를 인수로 호출한 결과를 할당한다.
Assert :
S 는 단일 코드 포인트만을 포함해야 한다.
CharacterComplement (rer ,
S )를 반환한다.
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
ps 에 source text
matched by UnicodePropertyName 를 할당한다.
p 에 UnicodeMatchProperty (rer ,
ps )를 할당한다.
Assert :
p 는 Unicode property name 또는 Table 69 의
“Property name and aliases” 컬럼에 있는 property alias이어야 한다.
vs 에 source text
matched by UnicodePropertyValue 를 할당한다.
v 에 UnicodeMatchPropertyValue (p ,
vs )를 할당한다.
A 에 p 속성 값이 v 인 모든 유니코드 코드 포인트를 포함하는 CharSet 를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
UnicodePropertyValueExpression
:: LoneUnicodePropertyNameOrValue
s 에 source text
matched by LoneUnicodePropertyNameOrValue 를
할당한다.
UnicodeMatchPropertyValue (General_Category,
s )가 PropertyValueAliases.txt 에
있는 General_Category(gc) 속성의 유니코드 property value 또는 property value alias이면,
속성이 “General_Category”이고 값이 s 인 모든 유니코드 코드 포인트를 포함하는 CharSet 를 반환한다.
p 에 UnicodeMatchProperty (rer ,
s )를 할당한다.
Assert :
p 는 Table 70 의 “Property
name and aliases” 컬럼에 있는 바이너리 유니코드 속성 또는 바이너리 속성 alias이거나, Table
71 의 “Property name” 컬럼에 있는 문자열 바이너리 유니코드 속성이어야 한다.
A 에 속성 p 값이 “True”인 CharSetElement를 모두 포함하는 CharSet 를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassUnion ::
ClassSetRange
ClassUnion opt
A 에 CompileToCharSet 를 ClassSetRange 에
rer 를 인수로 호출한 결과를 할당한다.
ClassUnion 가 존재하면,
B 에 CompileToCharSet 를
ClassUnion 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을
반환한다.
A 를 반환한다.
ClassUnion ::
ClassSetOperand
ClassUnion opt
A 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
ClassUnion 가 존재하면,
B 에 CompileToCharSet 를
ClassUnion 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을
반환한다.
A 를 반환한다.
ClassIntersection
::
ClassSetOperand
&&
ClassSetOperand
A 에 첫 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 교집합을 반환한다.
ClassIntersection
::
ClassIntersection
&&
ClassSetOperand
A 에 CompileToCharSet 를 ClassIntersection 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 교집합을 반환한다.
ClassSubtraction
::
ClassSetOperand
--
ClassSetOperand
A 에 첫 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 에서 B 에도 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
ClassSubtraction
::
ClassSubtraction
--
ClassSetOperand
A 에 CompileToCharSet 를 ClassSubtraction 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 CompileToCharSet 를 ClassSetOperand 에
rer 를 인수로 호출한 결과를 할당한다.
A 에서 B 에도 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
A 에 첫 번째 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
B 에 두 번째 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
CharacterRange (A ,
B ))를 반환한다.
참고 6
결과는 종종 두 개 이상의 범위로 구성된다. UnicodeSets가 true 이고 IgnoreCase가
true 인 경우, MaybeSimpleCaseFolding (rer ,
[Ā-č])는 해당 범위의 홀수 코드 포인트만 포함하게 된다.
ClassSetOperand
:: ClassSetCharacter
A 에 CompileToCharSet 를 ClassSetCharacter
에 rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassSetOperand
:: ClassStringDisjunction
A 에 CompileToCharSet 를 ClassStringDisjunction 에
rer 를 인수로 호출한 결과를 할당한다.
MaybeSimpleCaseFolding (rer ,
A )를 반환한다.
ClassSetOperand
:: NestedClass
CompileToCharSet 를 NestedClass 에
rer 를 인수로 호출한 결과를 반환한다.
NestedClass ::
[
ClassContents
]
CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 반환한다.
NestedClass ::
[^
ClassContents
]
A 에 CompileToCharSet 를 ClassContents 에
rer 를 인수로 호출한 결과를 할당한다.
CharacterComplement (rer ,
A )를 반환한다.
NestedClass ::
\
CharacterClassEscape
CompileToCharSet 를 CharacterClassEscape 에
rer 를 인수로 호출한 결과를 반환한다.
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
CompileToCharSet 를 ClassStringDisjunctionContents
에 rer 를 인수로 호출한 결과를 반환한다.
ClassStringDisjunctionContents
:: ClassString
s 에 CompileClassSetString 를
ClassString 에
rer 를 인수로 호출한 결과를 할당한다.
문자열 s 하나만 포함하는 CharSet 을 반환한다.
ClassStringDisjunctionContents
::
ClassString
|
ClassStringDisjunctionContents
s 에 CompileClassSetString 를
ClassString 에
rer 를 인수로 호출한 결과를 할당한다.
A 에 문자열 s 하나만 포함하는 CharSet 를 할당한다.
B 에 CompileToCharSet 를 ClassStringDisjunctionContents
에 rer 를 인수로 호출한 결과를 할당한다.
A 와 B 의 CharSet 합집합을 반환한다.
ClassSetCharacter
::
SourceCharacter
but not ClassSetSyntaxCharacter
\
CharacterEscape
\
ClassSetReservedPunctuator
cv 에 이 CharacterValue
of ClassSetCharacter 의 값을 할당한다.
c 에 문자값이 cv 인 문자를 할당한다.
c 만을 포함하는 CharSet 을 반환한다.
ClassSetCharacter
:: \b
U+0008(BACKSPACE) 문자 하나만 포함하는 CharSet 을 반환한다.
22.2.2.9.1 CharacterRange ( A , B )
CharacterRange 추상 연산은 A (CharSet ), B (CharSet )를 인수로 받고 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert : A 와 B 는 각각 정확히
하나의 문자를 포함해야 한다.
a 에 CharSet
A 의 단일 문자를 할당한다.
b 에 CharSet
B 의 단일 문자를 할당한다.
i 에 문자 a 의 문자값을 할당한다.
j 에 문자 b 의 문자값을 할당한다.
Assert : i ≤ j 임을
확인한다.
i 부터 j 까지 포함 구간 에 속하는 모든
문자값의 문자를 포함하는 CharSet 을 반환한다.
22.2.2.9.2 HasEitherUnicodeFlag ( rer )
HasEitherUnicodeFlag 추상 연산은 rer (RegExp
레코드 )를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[Unicode]] 가
true 이거나 rer .[[UnicodeSets]] 가 true 이면,
true 를 반환한다.
false 를 반환한다.
22.2.2.9.3 WordCharacters ( rer )
WordCharacters 추상 연산은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다. \b,
\B, \w, \W에 대해 "단어 문자"로 간주되는 문자를 포함하는 CharSet 을 반환한다. 호출 시 다음 단계를 수행한다:
basicWordChars 에 CharSet 을 할당한다. ASCII 단어 문자 의 모든 문자를 포함한다.
extraWordChars 에 CharSet 을 할당한다. c 가
basicWordChars 에는 없지만 Canonicalize (rer ,
c )가 basicWordChars 에 포함되는 모든 문자 c 를 포함한다.
Assert : extraWordChars 는
HasEitherUnicodeFlag (rer )
가 true 이고 rer .[[IgnoreCase]] 가 true 일 때가 아니면 비어 있어야
한다.
basicWordChars 와 extraWordChars 의 합집합을 반환한다.
22.2.2.9.4 AllCharacters ( rer )
AllCharacters 추상 연산은 rer (RegExp
레코드 )를 인수로 받고 CharSet 를 반환한다. 정규표현식 플래그에 따라 “모든 문자” 집합을
반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
true 이고 rer .[[IgnoreCase]] 가 true 이면,
Simple
Case Folding 매핑이 없는(scf (c )=c )
모든 유니코드 코드 포인트 c 를 포함하는 CharSet 을
반환한다.
그 외 HasEitherUnicodeFlag (rer )
가 true 이면,
모든 코드 포인트 값을 포함하는 CharSet 을 반환한다.
그 외,
모든 코드 유닛 값을 포함하는 CharSet 을 반환한다.
22.2.2.9.5 MaybeSimpleCaseFolding ( rer ,
A )
MaybeSimpleCaseFolding 추상 연산은 rer (RegExp
레코드 )와 A (CharSet )를 인수로 받아 CharSet 를 반환한다. rer .[[UnicodeSets]] 가 false 이거나 rer .[[IgnoreCase]] 가 false 이면 A 를 반환한다.
그렇지 않으면 Simple Case
Folding (scf(cp ) ) 정의를 CaseFolding.txt
파일에서 가져와서(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑) A 의 각 CharSetElement 를 문자 단위로 정규화 형태로 변환하여,
그 결과 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
false 이거나 rer .[[IgnoreCase]] 가 false 이면 A 를
반환한다.
B 에 새 빈 CharSet 을 할당한다.
A 의 각 CharSetElement s 에
대해 반복하여
t 에 빈 문자 시퀀스를 할당한다.
s 의 각 단일 코드 포인트 cp 에 대해 반복하여
scf (cp )를
t 에 추가한다.
t 를 B 에 추가한다.
B 를 반환한다.
22.2.2.9.6 CharacterComplement ( rer ,
S )
CharacterComplement 추상 연산은 rer (RegExp
레코드 )와 S (CharSet )를 인수로 받아 CharSet 를 반환한다. 호출 시 다음 단계를 수행한다:
A 에 AllCharacters (rer )를
할당한다.
A 에 포함되지만 S 에는 포함되지 않는 CharSetElement만 포함하는 CharSet 을 반환한다.
22.2.2.9.7 UnicodeMatchProperty ( rer ,
p )
UnicodeMatchProperty 추상 연산은 rer (RegExp
레코드 )와 p (ECMAScript 소스 텍스트 )
를 인수로 받아 유니코드 속성 이름 을 반환한다. 호출 시 다음 단계를 수행한다:
rer .[[UnicodeSets]] 가
true 이고 p 가 표 71 의
“속성 이름” 열에 있는 유니코드 속성 이름 이면,
유니코드 코드 포인트 p 의 List 를
반환한다.
Assert : p 는 표 69 또는
표 70 의 “속성 이름 및
별칭” 열에 있는 유니코드 속성 이름 또는 속성 별칭이어야 한다.
c 에 해당 행의 “표준 속성 이름 ” 열에 있는 p 의 표준
속성 이름 을 할당한다.
유니코드 코드 포인트 c 의 List 를
반환한다.
구현체는 표 69 , 표 70 , 표 71 에 나열된 유니코드
속성 이름과 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 구현체는 그 밖의 속성 이름이나 별칭을 지원해서는 안 된다.
참고 1
예를 들어, Script_Extensions(속성 이름 ) 및
scx(속성 별칭)는 유효하지만, script_extensions나
Scx는 유효하지 않다.
참고 2
나열된 속성은 UTS18 RL1.2 가 요구하는
것보다 더 넓은 집합을 이룬다.
참고 3
이 표의 항목(대소문자 포함) 철자는 유니코드 문자 데이터베이스의 PropertyAliases.txt
파일에서 사용되는 철자와 일치한다. 해당 파일의 정확한 철자는 변경되지
않을 것 이 보장된다.
표 69: 비이진 유니코드 속성 별칭과 표준 속성 이름
표 70: 이진 유니코드 속성 별칭과 표준 속성 이름
표 71: 문자열의 이진 유니코드 속성
속성 이름
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji
22.2.2.9.8 UnicodeMatchPropertyValue ( p ,
v )
UnicodeMatchPropertyValue 추상 연산은 p (ECMAScript 소스 텍스트 )와
v (ECMAScript 소스 텍스트 )
를 인수로 받아 유니코드 속성 값을 반환한다. 호출 시 다음 단계를 수행한다:
Assert : p 는 표 69 의 “표준 속성
이름” 열에 나열된 표준, 별칭 없는 유니코드 속성 이름 이어야 한다.
Assert : v 는 PropertyValueAliases.txt 에
p 유니코드 속성에 대해 나열된 속성 값 또는 속성 값 별칭이어야 한다.
value 에 해당 행의 “표준 속성 값” 열에 있는 v 의 표준 속성 값을 할당한다.
유니코드 코드 포인트 value 의 List 를
반환한다.
구현체는 표 69 에 나열된 속성에 대해 PropertyValueAliases.txt 에
나열된 유니코드 속성 값과 속성 값 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 그 밖의 속성 값이나 속성 값 별칭을 지원해서는 안 된다.
참고 1
예를 들어, Xpeo와 Old_Persian는
Script_Extensions의 유효한 값이지만 xpeo와
Old Persian는 유효하지 않다.
참고 2
이 알고리즘은 UAX44의 상징값
매칭 규칙 과 다르다: 대소문자, 공백 , U+002D(HYPHEN-MINUS),
U+005F(LOW LINE)은 무시되지 않으며, Is 접두사도 지원하지 않는다.
22.2.2.10 실행 시 의미론: CompileClassSetString
구문 지향 연산
CompileClassSetString은 rer (RegExp 레코드 )를 인수로 받아 문자 시퀀스를
반환한다. 다음 생성식에 대해 개별적으로 정의된다:
ClassString ::
[empty]
빈 문자 시퀀스를 반환한다.
ClassString ::
NonEmptyClassString
CompileClassSetString 를
NonEmptyClassString 에
rer 를 인수로 호출한 결과를 반환한다.
NonEmptyClassString
::
ClassSetCharacter
NonEmptyClassString opt
cs 에 CompileToCharSet 를 ClassSetCharacter 에
rer 를 인수로 호출한 결과를 할당한다.
s1 에 cs 의 단일 CharSetElement 로
이루어진 문자 시퀀스를 할당한다.
NonEmptyClassString 가 존재하면,
s2 에 CompileClassSetString 를
NonEmptyClassString 에
rer 를 인수로 호출한 결과를 할당한다.
s1 과 s2 를 연결한 값을 반환한다.
s1 를 반환한다.
22.2.3 RegExp 생성에 대한 추상 연산
22.2.3.1 RegExpCreate ( P , F )
추상 연산 RegExpCreate는 P (ECMAScript 언어
값 )와
F (문자열 또는 undefined )를 인수로 받고, 값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
obj 에 ! RegExpAlloc (%RegExp% )를 할당한다.
? RegExpInitialize (obj ,
P , F )를 반환한다.
22.2.3.2 RegExpAlloc ( newTarget )
추상 연산 RegExpAlloc은 newTarget (생성자 )를 인수로 받고, 값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
obj 에 ? OrdinaryCreateFromConstructor (newTarget ,
"%RegExp.prototype%" , « [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] »)를 할당한다.
! DefinePropertyOrThrow (obj ,
"lastIndex" , PropertyDescriptor { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })를 수행한다.
obj 를 반환한다.
22.2.3.3 RegExpInitialize ( obj , pattern ,
flags )
추상 연산 RegExpInitialize는 obj (객체), pattern (ECMAScript 언어 값 ),
flags (ECMAScript 언어 값 )를 인수로 받고,
값 완료(normal
completion) 객체 또는 throw 완료(throw
completion) 를 반환한다. 호출 시 다음 단계를 수행한다:
pattern 이 undefined 이면, P 에 빈 문자열을 할당한다.
그 외, P 에 ? ToString (pattern )을 할당한다.
flags 가 undefined 이면, F 에 빈 문자열을 할당한다.
그 외, F 에 ? ToString (flags )을 할당한다.
F 가 "d" , "g" ,
"i" , "m" , "s" ,
"u" , "v" , "y" 외의 코드 유닛을
포함하거나, F 에 코드 유닛이 중복되어 있으면 SyntaxError 예외를 throw한다.
F 에 "i" 가 있으면, i 에 true 를,
아니면 false 를 할당한다.
F 에 "m" 가 있으면, m 에 true 를,
아니면 false 를 할당한다.
F 에 "s" 가 있으면, s 에 true 를,
아니면 false 를 할당한다.
F 에 "u" 가 있으면, u 에 true 를,
아니면 false 를 할당한다.
F 에 "v" 가 있으면, v 에 true 를,
아니면 false 를 할당한다.
u 가 true 이거나 v 가 true 이면,
patternText 에 StringToCodePoints (P )를
할당한다.
그 외,
patternText 에 P 의 각 16비트 요소를 유니코드 BMP 코드 포인트로 해석한 결과를
할당한다. 요소에는 UTF-16 디코딩을 적용하지 않는다.
parseResult 에 ParsePattern (patternText ,
u , v )를 할당한다.
parseResult 가 List 의
SyntaxError 객체들을 포함하는 비어있지 않은 리스트이면,
SyntaxError 예외를 throw한다.
Assert :
parseResult 는 Pattern Parse Node 이어야 한다.
obj .[[OriginalSource]] 에 P 를 할당한다.
obj .[[OriginalFlags]] 에 F 를 할당한다.
capturingGroupsCount 에 CountLeftCapturingParensWithin (parseResult )를
할당한다.
rer 에 RegExp 레코드 { [[IgnoreCase]] : i , [[Multiline]] : m , [[DotAll]] : s , [[Unicode]] : u , [[UnicodeSets]] : v , [[CapturingGroupsCount]] :
capturingGroupsCount }를 할당한다.
obj .[[RegExpRecord]] 에 rer 를 할당한다.
obj .[[RegExpMatcher]] 에 CompilePattern 를
parseResult 에 rer 를 인수로 호출한 결과를 할당한다.
? Set (obj ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
obj 를 반환한다.
22.2.3.4 정적 의미론: ParsePattern (
patternText , u , v )
추상 연산 ParsePattern은 patternText (유니코드 코드 포인트 시퀀스), u (Boolean),
v (Boolean)을 인수로 받고, Parse Node 또는 비어있지 않은 List 의
SyntaxError 객체들을 반환한다.
참고
호출 시 다음 단계를 수행한다:
v 가 true 이고 u 가
true 이면,
parseResult 에 하나 이상의 SyntaxError 객체를 포함하는
List 를
할당한다.
그 외 v 가 true 이면,
parseResult 에 ParseText (patternText ,
Pattern [+UnicodeMode,
+UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
그 외 u 가 true 이면,
parseResult 에 ParseText (patternText ,
Pattern [+UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
그 외,
parseResult 에 ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )를 할당한다.
parseResult 를 반환한다.
22.2.4 RegExp 생성자
RegExp 생성자 :
%RegExp% 이다.
전역
객체 의 "RegExp" 프로퍼티의 초기값이다.
생성자 로 호출될
때 새로운 RegExp 객체를 생성하고 초기화한다.
함수로 호출될 때에는 새로운 RegExp 객체를 반환하거나, 인자가 RegExp 객체 하나뿐이라면 그 객체 자신을 반환한다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 RegExp 동작을 상속하려는 서브클래스 생성자 는 필요한 내부
슬롯으로 서브클래스 인스턴스를 생성·초기화하기 위해 RegExp 생성자 에 대한 super 호출을 반드시 포함해야 한다.
22.2.4.1 RegExp ( pattern , flags )
이 함수는 호출 시 다음 단계를 수행한다:
patternIsRegExp 에 ? IsRegExp (pattern )을 할당한다.
NewTarget이 undefined 이면,
newTarget 에 활성 함수
객체 를 할당한다.
patternIsRegExp 가 true 이고 flags 가
undefined 이면,
patternConstructor 에 ? Get (pattern ,
"constructor" )를 할당한다.
SameValue (newTarget ,
patternConstructor )가 true 이면
pattern 을 반환한다.
그 외,
newTarget 에 NewTarget을 할당한다.
pattern 이 객체 이고 pattern 에 [[RegExpMatcher]] 내부 슬롯이 있으면,
P 에 pattern .[[OriginalSource]] 를 할당한다.
flags 가 undefined 이면 F 에
pattern .[[OriginalFlags]] 를 할당한다.
그 외 F 에 flags 를 할당한다.
그 외 patternIsRegExp 가 true 이면,
P 에 ? Get (pattern ,
"source" )를 할당한다.
flags 가 undefined 이면,
F 에 ? Get (pattern ,
"flags" )를 할당한다.
그 외,
F 에 flags 를 할당한다.
그 외,
P 에 pattern 을 할당한다.
F 에 flags 를 할당한다.
O 에 ? RegExpAlloc (newTarget )을 할당한다.
? RegExpInitialize (O ,
P , F )를 반환한다.
참고
pattern이 StringLiteral 로 제공되는 경우, 본 함수에서 문자열을
처리하기 전에 일반적인 escape 시퀀스 치환이 수행된다. 패턴이 본 함수에서 escape 시퀀스를 포함해야만 인식되는 경우, StringLiteral 내부에서
U+005C(REVERSE SOLIDUS) 코드 포인트를 escape 처리해야 StringLiteral 내용이 생성될 때 제거되지 않는다.
22.2.5 RegExp 생성자의 속성들
RegExp 생성자 :
22.2.5.1 RegExp.escape ( S )
이 함수는 S 의 복사본을 반환하는데, 정규표현식 Pattern 에서 잠재적으로 특별한 문자가 각각 등가의 escape 시퀀스로 대체되어
있다.
호출 시 다음 단계를 수행한다:
S 가 문자열이
아니면 TypeError 예외를 throw한다.
escaped 에 빈 문자열을 할당한다.
cpList 에 StringToCodePoints (S )를
할당한다.
cpList 의 각 코드포인트 cp 에 대해, 다음을 수행한다:
escaped 가 빈 문자열이고 cp 가 DecimalDigit 또는 AsciiLetter 에
매치되면,
참고: 선행 숫자를 escape하는 것은 출력이 \0 문자 escape 또는 DecimalEscape (예:
\1) 뒤에 사용될 때 S 와 일치하도록 보장하고, 앞선 escape 시퀀스의
확장으로 해석되는 것을 방지한다. 선행 ASCII 문자를 escape하는 것도 \c 뒤의 상황에
대해 동일하다.
numericValue 에 cp 의 숫자값을 할당한다.
hex 에 Number::toString (𝔽 (numericValue ), 16)을
할당한다.
Assert : hex 의 길이는
2이다.
escaped 에 코드 유닛 0x005C(REVERSE SOLIDUS),
"x" , hex 를 문자열 연결 하여 할당한다.
그 외,
escaped 에 escaped 와 EncodeForRegExpEscape (cp )를
문자열 연결 하여 할당한다.
escaped 를 반환한다.
참고
이름이 비슷하지만 EscapeRegExpPattern 과
RegExp.escape는 서로 다른 동작을 한다. 전자는 패턴을 문자열로 표현하기 위해 escape하고, 이 함수는 문자열을
패턴 내부에 표현하기 위해 escape한다.
22.2.5.1.1 EncodeForRegExpEscape ( cp )
추상 연산 EncodeForRegExpEscape는 cp (코드 포인트)를 인수로 받아 문자열을 반환한다. cp 에 매치하는
Pattern 을 나타내는 문자열을 반환한다.
cp 가 공백 또는 ASCII 구두점이면 반환값은 escape 시퀀스이다. 그렇지 않으면 반환값은 문자열
cp 자체이다. 호출 시 다음 단계를 수행한다:
cp 가 SyntaxCharacter 에 매치되거나
cp 가 U+002F(SOLIDUS)면,
코드 유닛 0x005C(REVERSE SOLIDUS)와 UTF16EncodeCodePoint (cp )를
문자열 연결 하여 반환한다.
그 외 cp 가 표
67 의 "Code Point" 열에 나열된 코드 포인트면,
코드 유닛 0x005C(REVERSE SOLIDUS)와 해당 행의 "ControlEscape" 열의 문자열을 문자열 연결 하여 반환한다.
otherPunctuators 에 문자열 연결 하여
",-=<>#&!%:;@~'`" 와 코드 유닛 0x0022(QUOTATION MARK)를
할당한다.
toEscape 에 StringToCodePoints (otherPunctuators )를
할당한다.
toEscape 에 cp 가 포함되거나, cp 가 WhiteSpace 또는
LineTerminator 에 매치되거나,
cp 가 선행 서러게이트 또는 후행
서러게이트 와 동일한 숫자값을 가지면,
cpNum 에 cp 의 숫자값을 할당한다.
cpNum ≤ 0xFF이면,
hex 에 Number::toString (𝔽 (cpNum ), 16)을
할당한다.
코드 유닛 0x005C(REVERSE SOLIDUS), "x" , StringPad (hex ,
2, "0" , start )를
문자열 연결 하여
반환한다.
escaped 에 빈 문자열을 할당한다.
codeUnits 에 UTF16EncodeCodePoint (cp )를
할당한다.
codeUnits 의 각 코드 유닛 cu 에 대해,
escaped 에 escaped 와 UnicodeEscape (cu )를
문자열 연결 하여
할당한다.
escaped 를 반환한다.
UTF16EncodeCodePoint (cp )를
반환한다.
22.2.5.2 RegExp.prototype
RegExp.prototype의 초기값은 RegExp 프로토타입
객체 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
22.2.5.3 get RegExp [ %Symbol.species% ]
RegExp[%Symbol.species%]는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
this 값을 반환한다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 이다.
참고
RegExp 프로토타입 메서드는 일반적으로 자신의 this 값의 생성자 를 사용하여 파생 객체를 생성한다.
하지만 서브클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의하여
기본 동작을 오버라이드할 수 있다.
22.2.6 RegExp 프로토타입 객체의 속성들
RegExp 프로토타입 객체 :
%RegExp.prototype% 이다.
일반
객체 이다.
RegExp 인스턴스가 아니며 [[RegExpMatcher]] 내부 슬롯이나 RegExp 인스턴스 객체의 기타 내부
슬롯을 갖지 않는다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
참고
RegExp 프로토타입 객체는 자체적으로 "valueOf" 프로퍼티를 가지지 않지만, Object 프로토타입
객체 로부터 "valueOf" 프로퍼티를 상속받는다.
22.2.6.1 RegExp.prototype.constructor
RegExp.prototype.constructor의 초기값은 %RegExp% 이다.
22.2.6.2 RegExp.prototype.exec ( string )
이 메서드는 string 에서 정규표현식 패턴이 출현하는지 검색하고, 일치 결과를 담은 배열을 반환하거나 string 이 일치하지
않으면 null 을 반환한다.
호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
? RequireInternalSlot (R ,
[[RegExpMatcher]] )를 수행한다.
S 에 ? ToString (string )을 할당한다.
? RegExpBuiltinExec (R ,
S )를 반환한다.
22.2.6.3 get RegExp.prototype.dotAll
RegExp.prototype.dotAll은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0073(LATIN SMALL LETTER S)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.4 get RegExp.prototype.flags
RegExp.prototype.flags은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
codeUnits 에 새 빈 List 를 할당한다.
hasIndices 에 ToBoolean (? Get (R ,
"hasIndices" ))를 할당한다.
hasIndices 가 true 이면, 코드 유닛 0x0064(LATIN SMALL LETTER
D)를 codeUnits 에 추가한다.
global 에 ToBoolean (? Get (R ,
"global" ))를 할당한다.
global 이 true 이면, 코드 유닛 0x0067(LATIN SMALL LETTER G)를
codeUnits 에 추가한다.
ignoreCase 에 ToBoolean (? Get (R ,
"ignoreCase" ))를 할당한다.
ignoreCase 가 true 이면, 코드 유닛 0x0069(LATIN SMALL LETTER
I)를 codeUnits 에 추가한다.
multiline 에 ToBoolean (? Get (R ,
"multiline" ))를 할당한다.
multiline 이 true 이면, 코드 유닛 0x006D(LATIN SMALL LETTER M)를
codeUnits 에 추가한다.
dotAll 에 ToBoolean (? Get (R ,
"dotAll" ))를 할당한다.
dotAll 이 true 이면, 코드 유닛 0x0073(LATIN SMALL LETTER S)를
codeUnits 에 추가한다.
unicode 에 ToBoolean (? Get (R ,
"unicode" ))를 할당한다.
unicode 가 true 이면, 코드 유닛 0x0075(LATIN SMALL LETTER U)를
codeUnits 에 추가한다.
unicodeSets 에 ToBoolean (? Get (R ,
"unicodeSets" ))를 할당한다.
unicodeSets 가 true 이면, 코드 유닛 0x0076(LATIN SMALL LETTER
V)를 codeUnits 에 추가한다.
sticky 에 ToBoolean (? Get (R ,
"sticky" ))를 할당한다.
sticky 가 true 이면, 코드 유닛 0x0079(LATIN SMALL LETTER Y)를
codeUnits 에 추가한다.
codeUnits 의 요소로 이루어진 문자열 값을 반환한다. codeUnits 에 요소가 없으면 빈 문자열을
반환한다.
22.2.6.4.1 RegExpHasFlag ( R , codeUnit
)
추상 연산 RegExpHasFlag는 R (ECMAScript 언어
값 ), codeUnit (코드 유닛)을 인수로 받고, 값 완료(normal
completion) 로 Boolean 또는 undefined 를, 또는
throw 완료 를 반환한다.
호출 시 다음 단계를 수행한다:
R 이 객체가 아니면
TypeError 예외를 throw한다.
R 에 [[OriginalFlags]] 내부 슬롯이 없으면,
SameValue (R ,
%RegExp.prototype% )
가 true 이면 undefined 를 반환한다.
그 외에는 TypeError 예외를 throw한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
flags 에 codeUnit 이 포함되어 있으면 true 를 반환한다.
false 를 반환한다.
22.2.6.5 get RegExp.prototype.global
RegExp.prototype.global은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0067(LATIN SMALL LETTER G)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.6 get RegExp.prototype.hasIndices
RegExp.prototype.hasIndices은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0064(LATIN SMALL LETTER D)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.7 get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCase은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0069(LATIN SMALL LETTER I)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string
)
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "g" 이 포함되어 있지 않으면,
? RegExpExec (rx ,
S )를 반환한다.
그 외,
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를, 아니면
false 를 할당한다.
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
A 에 ! ArrayCreate (0)을 할당한다.
n 에 0을 할당한다.
반복,
result 에 ? RegExpExec (rx ,
S )를 할당한다.
result 가 null 이면,
n = 0이면 null 을 반환한다.
A 를 반환한다.
그 외,
matchStr 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
matchStr )를 수행한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (?
ToLength (?
Get (rx ,
"lastIndex" )))를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (rx ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
n 에 n + 1을 할당한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.match]" 이다.
참고
%Symbol.match% 프로퍼티는 IsRegExp
추상 연산에서 객체가 기본적인 정규표현식 동작을 가지는지를 식별하는 데 사용된다. %Symbol.match% 프로퍼티가 없거나 그 값이
Boolean 변환 시 true 가 아니면 해당 객체는 정규표현식 객체로 사용하기 위한 것이 아니다.
22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] (
string )
이 메서드는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
C 에 ? SpeciesConstructor (R ,
%RegExp% )를 할당한다.
flags 에 ? ToString (? Get (R ,
"flags" ))를 할당한다.
matcher 에 ? Construct (C , « R ,
flags »)를 할당한다.
lastIndex 에 ? ToLength (? Get (R ,
"lastIndex" ))를 할당한다.
? Set (matcher ,
"lastIndex" , lastIndex , true )를
수행한다.
flags 에 "g" 이 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를 할당한다.
그 외 fullUnicode 에 false 를 할당한다.
CreateRegExpStringIterator (matcher ,
S , global , fullUnicode )를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.matchAll]" 이다.
22.2.6.10 get RegExp.prototype.multiline
RegExp.prototype.multiline은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x006D(LATIN SMALL LETTER M)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.11 RegExp.prototype [ %Symbol.replace% ] (
string , replaceValue )
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
lengthS 에 S 의 길이를 할당한다.
functionalReplace 에 IsCallable (replaceValue )를
할당한다.
functionalReplace 이 false 이면,
replaceValue 에 ? ToString (replaceValue )를
할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "g" 이 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
global 이 true 이면,
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
results 에 새 빈 List 를 할당한다.
done 에 false 를 할당한다.
반복, done 이 false 인 동안,
result 에 ? RegExpExec (rx ,
S )를 할당한다.
result 가 null 이면,
done 에 true 를 할당한다.
그 외,
result 를 results 에 추가한다.
global 이 false 이면,
done 에 true 를 할당한다.
그 외,
matchStr 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (?
ToLength (?
Get (rx ,
"lastIndex" )))를 할당한다.
flags 에 "u" 나
"v" 가 포함되어 있으면
fullUnicode 에 true 를,
아니면 false 를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (rx ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
accumulatedResult 에 빈 문자열을 할당한다.
nextSourcePosition 에 0을 할당한다.
results 의 각 요소 result 에 대해,
resultLength 에 ? LengthOfArrayLike (result )를
할당한다.
nCaptures 에 max (resultLength - 1, 0)를
할당한다.
matched 에 ? ToString (?
Get (result ,
"0" ))를 할당한다.
matchLength 에 matched 의 길이를 할당한다.
position 에 ? ToIntegerOrInfinity (? Get (result ,
"index" ))를 할당한다.
position 을 0과 lengthS 사이로 클램핑(clamping) 한다.
captures 에 새 빈 List 를
할당한다.
n 에 1을 할당한다.
반복, n ≤ nCaptures 인 동안,
capN 에 ? Get (result ,
! ToString (𝔽 (n ))).
capN 이 undefined 가 아니면,
capN 에 ? ToString (capN )을
할당한다.
capN 을 captures 에 추가한다.
참고: n = 1일 때 위 단계는 captures (인덱스 0)에 첫 번째 요소를
넣는다. 보다 일반적으로 n 번째 캡처(캡처 괄호 집합에 의해 캡처된 문자들)는
captures [n - 1]에 있다.
n 에 n + 1을 할당한다.
namedCaptures 에 ? Get (result ,
"groups" )를 할당한다.
functionalReplace 가 true 이면,
replacerArgs 에 « matched »,
captures , « 𝔽 (position ),
S »의 리스트
연결(list-concatenation) 을 할당한다.
namedCaptures 가 undefined 가 아니면,
namedCaptures 를 replacerArgs 에 추가한다.
replacementValue 에 ? Call (replaceValue ,
undefined , replacerArgs )를 할당한다.
replacementString 에 ? ToString (replacementValue )를
할당한다.
그 외,
namedCaptures 가 undefined 가 아니면,
namedCaptures 에 ? ToObject (namedCaptures )를
할당한다.
replacementString 에 ? GetSubstitution (matched ,
S , position , captures ,
namedCaptures , replaceValue )를 할당한다.
position ≥ nextSourcePosition 이면,
참고: position 이 일반적으로 뒤로 이동하면 안 된다. 만약 그렇다면 이는 잘못된 동작의
RegExp 서브클래스이거나 global 플래그 또는 rx 의 기타 특성을 변경하는 접근 트리거 부작용의
사용을 나타낸다. 이런 경우 해당 치환은 무시된다.
accumulatedResult 에 accumulatedResult ,
S 의 nextSourcePosition 부터 position 까지의
부분
문자열(substring) , replacementString 을
문자열 연결 하여 할당한다.
nextSourcePosition 에 position +
matchLength 를 할당한다.
nextSourcePosition ≥ lengthS 이면 accumulatedResult 를
반환한다.
accumulatedResult 와 S 의 nextSourcePosition 부터 마지막까지의
부분
문자열(substring) 을 문자열 연결 하여 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.replace]" 이다.
22.2.6.12 RegExp.prototype [ %Symbol.search% ] (
string )
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
previousLastIndex 에 ? Get (rx ,
"lastIndex" )를 할당한다.
previousLastIndex 가 +0 𝔽 이 아니면,
? Set (rx ,
"lastIndex" , +0 𝔽 ,
true )를 수행한다.
result 에 ? RegExpExec (rx , S )를
할당한다.
currentLastIndex 에 ? Get (rx ,
"lastIndex" )를 할당한다.
SameValue (currentLastIndex ,
previousLastIndex )가 false 이면,
? Set (rx ,
"lastIndex" , previousLastIndex ,
true )를 수행한다.
result 가 null 이면 -1 𝔽 를
반환한다.
? Get (result ,
"index" )를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.search]" 이다.
참고
검색을 수행할 때 이 RegExp 객체의 "lastIndex" 와 "global"
프로퍼티는 무시된다. "lastIndex" 프로퍼티는 변경되지 않는다.
22.2.6.13 get RegExp.prototype.source
RegExp.prototype.source은 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
R 에 [[OriginalSource]] 내부 슬롯이 없으면,
SameValue (R ,
%RegExp.prototype% )
가 true 이면 "(?:)" 를 반환한다.
그 외에는 TypeError 예외를 throw한다.
Assert :
R 에 [[OriginalFlags]] 내부 슬롯이 있다.
src 에 R .[[OriginalSource]] 를 할당한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
EscapeRegExpPattern (src ,
flags )를 반환한다.
22.2.6.13.1 EscapeRegExpPattern ( P , F
)
추상 연산 EscapeRegExpPattern은 P (문자열), F (문자열)를 인수로 받아 문자열을 반환한다. 호출 시
다음 단계를 수행한다:
F 에 "v" 가 포함되어 있으면,
patternSymbol 에 Pattern [+UnicodeMode,
+UnicodeSetsMode] 을 할당한다.
그 외 F 에 "u" 가 포함되어 있으면,
patternSymbol 에 Pattern [+UnicodeMode,
~UnicodeSetsMode] 을 할당한다.
그 외,
patternSymbol 에 Pattern [~UnicodeMode,
~UnicodeSetsMode] 을 할당한다.
S 에 P 를 UTF-16 인코딩된 유니코드 코드포인트(6.1.4 )로
해석하여 patternSymbol 형태의 문자열을 할당한다. 다음에 설명된 대로 일부 코드포인트는 escape된다.
S 는 P 와 다를 수도 있고 같을 수도 있다. 단, S 를
patternSymbol 로 평가하여 얻는 추상 클로저(Abstract
Closure) 는 생성된 객체의 [[RegExpMatcher]] 내부 슬롯에 의해 정의되는 추상 클로저 와 동일하게 동작해야 한다. 동일한
P , F 로 여러 번 호출해도 결과는 항상 동일해야 한다.
패턴에 등장하는 / 또는 LineTerminator 코드포인트는
S 에서 escape되어야 한다. 이는 문자열
연결(string-concatenation) 을 통해 "/" ,
S , "/" , F 를 적절한 렉시컬 컨텍스트에서 RegularExpressionLiteral 로
파싱할 수 있게 하고, 생성된 정규표현식과 동일하게 동작해야 한다. 예를 들어, P 가
"/" 이면 S 는 "\/" 또는
"\u002F" 등이 될 수 있지만 "/" 는 안 된다. 왜냐하면
/// 뒤에 F 가 오면 SingleLineComment 로 파싱되기
때문이다. P 가 빈 문자열이면 S 를 "(?:)" 로 하면 된다.
S 를 반환한다.
참고
이름이 비슷하지만 RegExp.escape와 EscapeRegExpPattern은 동작이 다르다. 전자는 문자열을 패턴
내부에 표현하기 위해 escape하고, 이 함수는 패턴을 문자열로 표현하기 위해 escape한다.
22.2.6.14 RegExp.prototype [ %Symbol.split% ] (
string , limit )
참고 1
이 메서드는 string 을 문자열로 변환한 결과의 부분 문자열들을 배열로 반환한다. 부분 문자열들은 왼쪽에서 오른쪽으로
this 값의 정규표현식에 매치되는 구간을 기준으로 나뉘는데, 매치된 구간들은 반환 배열의 어떤 문자열에도 포함되지
않고, 문자열을 분리하는 역할만 한다.
this 값이 빈 정규표현식이거나 빈 문자열에 매치될 수 있는 정규표현식일 수도 있다. 이 경우 정규표현식은 입력
문자열의 처음이나 끝에 있는 빈 부분 문자열 , 또는 이전 구분자 매치의 끝에 있는 빈
부분 문자열 과는 매치되지 않는다. (예: 정규표현식이 빈 문자열에 매치된다면 문자열은 개별 코드 유닛
단위로 분리된다. 결과 배열의 길이는 문자열의 길이와 같고 각 부분 문자열 에는 코드 유닛 하나만
포함된다.) 주어진 인덱스에서의 첫 번째 매치만 고려하며, 백트래킹으로 해당 인덱스에서 비어있지 않은 부분
문자열 매치를 얻을 수 있어도 무시한다. (예: /a*?/[Symbol.split]("ab")는
배열 ["a", "b"]가 되고, /a*/[Symbol.split]("ab")는
["","b"]가 된다.)
string 이(혹은 변환 결과가) 빈 문자열이면, 결과는 정규표현식이 빈 문자열에 매치되는지 여부에 따라 달라진다. 매치된다면 결과
배열에는 아무 요소도 없다. 그렇지 않으면 결과 배열에 빈 문자열 하나가 들어간다.
정규표현식에 캡처 괄호가 있으면 separator 가 매치될 때마다 캡처된 결과(캡처 실패 시
undefined 포함)들이 출력 배열에 삽입된다. 예시:
/<(\/)?([^<> ]+)>/[Symbol.split]("A<B > bold</B > and<CODE > coded</CODE > ")
이 표현식의 결과 배열:
["A" , undefined , "B" , "bold" , "/" , "B" , "and" , undefined , "CODE" , "coded" , "/" , "CODE" , "" ]
limit 이 undefined 가 아니면, 출력 배열은 limit 개까지만
포함한다.
이 메서드는 호출 시 다음 단계를 수행한다:
rx 에 this 값을 할당한다.
rx 이 객체가 아니면 TypeError
예외를 throw한다.
S 에 ? ToString (string )을 할당한다.
C 에 ? SpeciesConstructor (rx ,
%RegExp% )를 할당한다.
flags 에 ? ToString (? Get (rx ,
"flags" ))를 할당한다.
flags 에 "u" 또는 "v" 가 포함되어 있으면
unicodeMatching 에 true 를 할당한다.
그 외 unicodeMatching 에 false 를 할당한다.
flags 에 "y" 가 포함되어 있으면 newFlags 에
flags 를 할당한다.
그 외 newFlags 에 flags 와 "y" 를 문자열
연결(string-concatenation) 하여 할당한다.
splitter 에 ? Construct (C ,
« rx ,
newFlags »)를 할당한다.
A 에 ! ArrayCreate (0)을 할당한다.
lengthA 에 0을 할당한다.
limit 이 undefined 이면 lim 에 232 -
1를, 아니면 lim 에 ℝ (? ToUint32 (limit ))를 할당한다.
lim = 0이면 A 를 반환한다.
S 가 빈 문자열이면,
z 에 ? RegExpExec (splitter ,
S )를 할당한다.
z 가 null 이 아니면 A 를 반환한다.
! CreateDataPropertyOrThrow (A ,
"0" , S )를 수행한다.
A 를 반환한다.
size 에 S 의 길이를 할당한다.
p 에 0을 할당한다.
q 에 p 를 할당한다.
반복, q < size 인 동안,
? Set (splitter ,
"lastIndex" , 𝔽 (q ),
true )를 수행한다.
z 에 ? RegExpExec (splitter ,
S )를 할당한다.
z 가 null 이면,
q 에 AdvanceStringIndex (S ,
q , unicodeMatching )를 할당한다.
그 외,
e 에 ℝ (? ToLength (? Get (splitter ,
"lastIndex" )))를 할당한다.
e 에 min (e ,
size )를 할당한다.
e = p 이면,
q 에 AdvanceStringIndex (S ,
q , unicodeMatching )를 할당한다.
그 외,
T 에 S 의 p 부터 q 까지의
부분 문자열(substring) 을
할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
T )를 수행한다.
lengthA 에 lengthA + 1을 할당한다.
lengthA = lim 이면 A 를 반환한다.
p 에 e 를 할당한다.
numberOfCaptures 에 ? LengthOfArrayLike (z )를
할당한다.
numberOfCaptures 에 max (numberOfCaptures
- 1, 0)를 할당한다.
i 에 1을 할당한다.
반복, i ≤ numberOfCaptures 인 동안,
nextCapture 에 ? Get (z ,
! ToString (𝔽 (i ))).
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
nextCapture )를 수행한다.
i 에 i + 1을 할당한다.
lengthA 에 lengthA + 1을 할당한다.
lengthA = lim 이면
A 를 반환한다.
q 에 p 를 할당한다.
T 에 S 의 p 부터 size 까지의 부분
문자열(substring) 을 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (lengthA )),
T )를 수행한다.
A 를 반환한다.
이 메서드의 "name" 프로퍼티 값은
"[Symbol.split]" 이다.
참고 2
이 메서드는 이 RegExp 객체의 "global" 과 "sticky" 프로퍼티 값을
무시한다.
22.2.6.15 get RegExp.prototype.sticky
RegExp.prototype.sticky는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0079(LATIN SMALL LETTER Y)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.16 RegExp.prototype.test ( S )
이 메서드는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
string 에 ? ToString (S )를 할당한다.
match 에 ? RegExpExec (R ,
string )를 할당한다.
match 가 null 이 아니면 true 를, 아니면
false 를 반환한다.
22.2.6.17 RegExp.prototype.toString ( )
R 에 this 값을 할당한다.
R 이 객체가 아니면 TypeError
예외를 throw한다.
pattern 에 ? ToString (? Get (R ,
"source" ))를 할당한다.
flags 에 ? ToString (? Get (R ,
"flags" ))를 할당한다.
result 에 문자열 연결(string-concatenation) 을
사용해 "/" , pattern , "/" ,
flags 를 이어붙여 할당한다.
result 를 반환한다.
참고
반환되는 문자열은 RegularExpressionLiteral
형태를 가지며, 이 객체와 동일하게 동작하는 다른 RegExp 객체로 평가된다.
22.2.6.18 get RegExp.prototype.unicode
RegExp.prototype.unicode는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0075(LATIN SMALL LETTER U)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.6.19 get RegExp.prototype.unicodeSets
RegExp.prototype.unicodeSets는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:
R 에 this 값을 할당한다.
cu 에 코드 유닛 0x0076(LATIN SMALL LETTER V)를 할당한다.
? RegExpHasFlag (R ,
cu )를 반환한다.
22.2.7 정규표현식 매칭에 대한 추상 연산
22.2.7.1 RegExpExec ( R , S )
추상 연산 RegExpExec는 R (객체), S (문자열)를 인수로 받고, 값 완료(normal
completion) 로 객체나 null 또는 throw 완료 를 반환한다. 호출 시
다음 단계를 수행한다:
exec 에 ? Get (R ,
"exec" )를 할당한다.
IsCallable (exec )가
true 이면,
result 에 ? Call (exec ,
R , « S »)를 할당한다.
result 가 객체가 아니고 result 가
null 이 아니면 TypeError 예외를 throw한다.
result 를 반환한다.
? RequireInternalSlot (R ,
[[RegExpMatcher]] )를 수행한다.
? RegExpBuiltinExec (R ,
S )를 반환한다.
참고
호출 가능한 "exec" 프로퍼티가 없으면 이 알고리즘은 내장 정규표현식 매칭 알고리즘을 사용한다. 이는 이전 버전에서
정규표현식을 사용하는 대부분의 내장 알고리즘이 "exec" 의 동적 프로퍼티 조회를 수행하지 않았던 코드와 호환되는
동작을 제공한다.
22.2.7.2 RegExpBuiltinExec ( R , S )
추상 연산 RegExpBuiltinExec는 R (초기화된 RegExp 인스턴스), S (문자열)를 인수로 받고, 값 완료(normal
completion) 로 배열 특수 객체(Array exotic object) 또는
null 또는 throw
완료 를 반환한다. 호출 시 다음 단계를 수행한다:
length 에 S 의 길이를 할당한다.
lastIndex 에 ℝ (? ToLength (? Get (R ,
"lastIndex" )))를 할당한다.
flags 에 R .[[OriginalFlags]] 를 할당한다.
flags 에 "g" 가 포함되어 있으면 global 에
true 를, 아니면 false 를 할당한다.
flags 에 "y" 가 포함되어 있으면 sticky 에
true 를, 아니면 false 를 할당한다.
flags 에 "d" 가 포함되어 있으면 hasIndices 에
true 를, 아니면 false 를 할당한다.
global 이 false 이고 sticky 가
false 이면 lastIndex 를 0으로 설정한다.
matcher 에 R .[[RegExpMatcher]] 를 할당한다.
flags 에 "u" 나 "v" 가 포함되어 있으면
fullUnicode 에 true 를, 아니면 false 를
할당한다.
matchSucceeded 에 false 를 할당한다.
fullUnicode 가 true 이면 input 에 StringToCodePoints (S )를,
아니면 input 에 S 의 코드 유닛으로 이루어진 List 를 할당한다.
참고: input 의 각 요소는 문자로 취급된다.
반복, matchSucceeded 가 false 인 동안,
lastIndex > length 이면,
global 이 true 이거나 sticky 가
true 이면,
? Set (R ,
"lastIndex" ,
+0 𝔽 ,
true )를 수행한다.
null 을 반환한다.
inputIndex 에 S 의 lastIndex 번째 요소로 얻은 문자의
input 에서의 인덱스를 할당한다.
r 에 matcher (input , inputIndex )를
할당한다.
r 가 failure 이면,
sticky 가 true 이면,
? Set (R ,
"lastIndex" ,
+0 𝔽 ,
true )를 수행한다.
null 을 반환한다.
lastIndex 를 AdvanceStringIndex (S ,
lastIndex , fullUnicode )로 설정한다.
그 외,
Assert : r 는
MatchState 이다.
matchSucceeded 를 true 로 설정한다.
e 에 r .[[EndIndex]] 를 할당한다.
fullUnicode 가 true 이면 e 를 GetStringIndex (S ,
e )로 설정한다.
global 이 true 이거나 sticky 가
true 이면,
? Set (R ,
"lastIndex" , 𝔽 (e ),
true )를 수행한다.
n 에 r .[[Captures]] 의 요소 개수를 할당한다.
Assert :
n = R .[[RegExpRecord]] .[[CapturingGroupsCount]] 이다.
Assert :
n < 232 - 1이다.
A 에 ! ArrayCreate (n + 1)을 할당한다.
Assert :
A 의 "length" 프로퍼티의 수학적 값 은 n + 1이다.
! CreateDataPropertyOrThrow (A ,
"index" , 𝔽 (lastIndex ))를 수행한다.
! CreateDataPropertyOrThrow (A ,
"input" , S )를 수행한다.
match 에 Match Record { [[StartIndex]] : lastIndex , [[EndIndex]] : e }를 할당한다.
indices 에 새 빈 List 를 할당한다.
groupNames 에 새 빈 List 를 할당한다.
match 를 indices 에 추가한다.
matchedSubstr 에 GetMatchString (S ,
match )를 할당한다.
! CreateDataPropertyOrThrow (A ,
"0" , matchedSubstr )를 수행한다.
R 에 GroupName 이 있으면,
groups 에 OrdinaryObjectCreate (null )를
할당한다.
hasGroups 에 true 를 할당한다.
그 외,
groups 에 undefined 를 할당한다.
hasGroups 에 false 를 할당한다.
! CreateDataPropertyOrThrow (A ,
"groups" , groups )를 수행한다.
matchedGroupNames 에 새 빈 List 를 할당한다.
각 integer i 에 대해 1 ≤ i ≤
n 인 경우 오름차순으로 반복,
captureI 에 r .[[Captures]] 의
i 번째 요소를 할당한다.
captureI 가 undefined 이면,
capturedValue 에 undefined 를 할당한다.
undefined 를 indices 에 추가한다.
그 외,
captureStart 에 captureI .[[StartIndex]] 를 할당한다.
captureEnd 에 captureI .[[EndIndex]] 를 할당한다.
fullUnicode 가 true 이면,
captureStart 를 GetStringIndex (S ,
captureStart )로 설정한다.
captureEnd 를 GetStringIndex (S ,
captureEnd )로 설정한다.
capture 에 Match
Record { [[StartIndex]] : captureStart ,
[[EndIndex]] : captureEnd }를
할당한다.
capturedValue 에 GetMatchString (S ,
capture )를 할당한다.
capture 를 indices 에 추가한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (i )),
capturedValue )를 수행한다.
R 의 i 번째 캡처가 GroupName 으로 정의되어 있으면,
s 에 해당 GroupName 의 CapturingGroupName 을
할당한다.
matchedGroupNames 가 s 를 포함하면,
Assert :
capturedValue 는 undefined 이다.
undefined 를 groupNames 에 추가한다.
그 외,
capturedValue 가 undefined 가 아니면
s 를 matchedGroupNames 에 추가한다.
참고: 동일한 이름 s 를 가진 그룹이 둘 이상 있을 수 있다. 이 경우
groups 에 이미 s 프로퍼티가 있을 수 있다. 그러나
groups 는 일반
객체 이고, 프로퍼티는 모두 데이터 프로퍼티(data
properties) 이므로 CreateDataPropertyOrThrow
호출은 반드시 성공한다.
! CreateDataPropertyOrThrow (groups ,
s , capturedValue )를 수행한다.
s 를 groupNames 에 추가한다.
그 외,
undefined 를 groupNames 에 추가한다.
hasIndices 가 true 이면,
indicesArray 에 MakeMatchIndicesIndexPairArray (S ,
indices , groupNames , hasGroups )를 할당한다.
! CreateDataPropertyOrThrow (A ,
"indices" , indicesArray )를 수행한다.
A 를 반환한다.
22.2.7.3 AdvanceStringIndex ( S , index ,
unicode )
추상 연산 AdvanceStringIndex는 S (문자열), index (음수가 아닌 정수(integer) ),
unicode (Boolean)을 인수로 받고 정수(integer) 를 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
index ≤ 253 - 1.
unicode 가 false 이면 index + 1을 반환한다.
length 에 S 의 길이를 할당한다.
index + 1 ≥ length 이면 index + 1을 반환한다.
cp 에 CodePointAt (S ,
index )를 할당한다.
index + cp .[[CodeUnitCount]] 를 반환한다.
22.2.7.4 GetStringIndex ( S ,
codePointIndex )
추상 연산 GetStringIndex는 S (문자열), codePointIndex (음수가 아닌 정수(integer) )를 인수로 받고
음수가 아닌 정수(integer) 를 반환한다. S 를 6.1.4 에 따라 UTF-16
인코딩된 코드포인트 시퀀스로 해석하고, codePointIndex 에 해당하는 코드유닛 인덱스를 반환한다. 그런 인덱스가 없으면
S 의 길이를 반환한다. 호출 시 다음 단계를 수행한다:
S 가 빈 문자열이면 0을 반환한다.
len 에 S 의 길이를 할당한다.
codeUnitCount 에 0을 할당한다.
codePointCount 에 0을 할당한다.
반복, codeUnitCount < len 인 동안,
codePointCount = codePointIndex 이면
codeUnitCount 를 반환한다.
cp 에 CodePointAt (S ,
codeUnitCount )를 할당한다.
codeUnitCount 를 codeUnitCount + cp .[[CodeUnitCount]] 로 설정한다.
codePointCount 를 codePointCount + 1로 설정한다.
len 을 반환한다.
22.2.7.5 매치 레코드(Match Records)
매치 레코드(Match Record) 는 정규표현식 매치나 캡처의 시작 및 끝
인덱스를 캡슐화하는 레코드(Record) 값이다.
매치 레코드는 표
72 에 나열된 필드를 가진다.
표 72: 매치 레코드(Match Record) 필드
필드 이름(Field Name)
값(Value)
의미(Meaning)
[[StartIndex]]
음수가 아닌 정수(integer)
문자열의 시작부터 매치가 시작되는 위치(포함)의 코드유닛 수.
[[EndIndex]]
정수(integer) ≥ [[StartIndex]]
문자열의 시작부터 매치가 끝나는 위치(제외)의 코드유닛 수.
22.2.7.6 GetMatchString ( S , match )
추상 연산 GetMatchString은 S (문자열), match (매치 레코드(Match Record) )를 인수로
받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S 의 길이.
S 의 match .[[StartIndex]] 부터
match .[[EndIndex]] 까지의 부분
문자열(substring) 을 반환한다.
22.2.7.7 GetMatchIndexPair ( S , match )
추상 연산 GetMatchIndexPair는 S (문자열), match (매치 레코드(Match
Record) )를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:
Assert :
match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S 의 길이.
CreateArrayFromList («
𝔽 (match .[[StartIndex]] ), 𝔽 (match .[[EndIndex]] ) »)를 반환한다.
22.2.7.8 MakeMatchIndicesIndexPairArray ( S ,
indices , groupNames , hasGroups )
추상 연산 MakeMatchIndicesIndexPairArray는 S (문자열), indices (Match Records 또는
undefined 의 List ),
groupNames (문자열 또는 undefined 의 List ),
hasGroups (Boolean)를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:
n 에 indices 의 요소 개수를 할당한다.
Assert :
n < 232 - 1.
Assert :
groupNames 는 n - 1개의 요소를 가진다.
참고: groupNames List 의 요소는
indices List 의
indices [1]부터 정렬된다.
A 에 ! ArrayCreate (n )를 할당한다.
hasGroups 가 true 이면,
groups 에 OrdinaryObjectCreate (null )를
할당한다.
그 외,
groups 에 undefined 를 할당한다.
! CreateDataPropertyOrThrow (A ,
"groups" , groups )를 수행한다.
각 integer i 에 대해 0 ≤ i
< n 인 경우 오름차순으로 반복,
matchIndices 에 indices [i ]를 할당한다.
matchIndices 가 undefined 가 아니면,
matchIndexPair 에 GetMatchIndexPair (S ,
matchIndices )를 할당한다.
그 외,
matchIndexPair 에 undefined 를 할당한다.
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (i )),
matchIndexPair )를 수행한다.
i > 0이면,
s 에 groupNames [i - 1]을 할당한다.
s 가 undefined 가 아니면,
Assert :
groups 는 undefined 가 아니다.
참고: 동일한 이름 s 를 가진 그룹이 둘 이상 있을 수 있다. 이 경우
groups 에 이미 s 프로퍼티가 있을 수 있다. 그러나
groups 는 일반
객체 이고, 프로퍼티는 모두 데이터 프로퍼티(data
properties) 이므로 CreateDataPropertyOrThrow
호출은 반드시 성공한다.
! CreateDataPropertyOrThrow (groups ,
s , matchIndexPair )를 수행한다.
A 를 반환한다.
22.2.8 RegExp 인스턴스의 속성
RegExp 인스턴스는 일반
객체 이며,
RegExp 프로토타입
객체 로부터 속성을 상속받는다. RegExp 인스턴스는 내부 슬롯 [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] 를 가진다.
[[RegExpMatcher]] 내부 슬롯의 값은 RegExp 객체의 Pattern 에 대한 추상 클로저(Abstract Closure)
표현이다.
참고
ECMAScript 2015 이전에는 RegExp 인스턴스가 자체 데이터 프로퍼티(data properties)
"source" ,
"global" , "ignoreCase" ,
"multiline" 를 가진 것으로 명세되어 있었다. 이 속성들은 이제
RegExp.prototype의 접근자 프로퍼티(accessor properties) 로 명세된다.
RegExp 인스턴스는 다음 속성도 갖는다:
22.2.8.1 lastIndex
"lastIndex" 프로퍼티의 값은 다음 매치를 시작할 문자열 인덱스를 지정한다. 사용될 때 정수(Number) 로 강제 변환된다(자세한 내용은 22.2.7.2 참조). 이 프로퍼티의 속성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }이다.
22.2.9 RegExp 문자열 반복자 객체
RegExp 문자열 반복자(RegExp String Iterator) 는 특정 문자열 인스턴스 객체에서, 특정 RegExp 인스턴스
객체와 매칭하며 반복을 수행하는 객체이다. RegExp 문자열 반복자 객체에 대한 명명된 생성자 는 없다. 대신, RegExp 문자열 반복자 객체는 RegExp
인스턴스의 특정 메서드를 호출해서 생성된다.
22.2.9.1 CreateRegExpStringIterator ( R ,
S , global , fullUnicode )
추상 연산 CreateRegExpStringIterator는 R (객체), S (문자열),
global (Boolean), fullUnicode (Boolean)을 인수로 받아 객체를 반환한다. 호출 시 다음 단계를
수행한다:
iterator 에 OrdinaryObjectCreate (%RegExpStringIteratorPrototype% ,
« [[IteratingRegExp]] , [[IteratedString]] , [[Global]] ,
[[Unicode]] , [[Done]] »).
iterator .[[IteratingRegExp]] 에
R 를 할당한다.
iterator .[[IteratedString]] 에 S 를 할당한다.
iterator .[[Global]] 에 global 을 할당한다.
iterator .[[Unicode]] 에
fullUnicode 를 할당한다.
iterator .[[Done]] 에
false 를 할당한다.
iterator 를 반환한다.
22.2.9.2 %RegExpStringIteratorPrototype% 객체
%RegExpStringIteratorPrototype% 객체:
22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )
O 에 this 값을 할당한다.
O 이 객체가 아니면
TypeError 예외를 throw한다.
O 에 RegExp 문자열
반복자 객체 인스턴스의 모든 내부 슬롯이 없으면(22.2.9.3
참조),
TypeError 예외를 throw한다.
O .[[Done]] 이 true 이면,
CreateIteratorResultObject (undefined ,
true )를 반환한다.
R 에 O .[[IteratingRegExp]] 를 할당한다.
S 에 O .[[IteratedString]] 를 할당한다.
global 에 O .[[Global]] 를 할당한다.
fullUnicode 에 O .[[Unicode]] 를 할당한다.
match 에 ? RegExpExec (R ,
S )를 할당한다.
match 가 null 이면,
O .[[Done]] 을
true 로 설정한다.
CreateIteratorResultObject (undefined ,
true )를 반환한다.
global 이 false 이면,
O .[[Done]] 을
true 로 설정한다.
CreateIteratorResultObject (match ,
false )를 반환한다.
matchStr 에 ? ToString (?
Get (match ,
"0" ))를 할당한다.
matchStr 이 빈 문자열이면,
thisIndex 에 ℝ (? ToLength (? Get (R ,
"lastIndex" )))를 할당한다.
nextIndex 에 AdvanceStringIndex (S ,
thisIndex , fullUnicode )를 할당한다.
? Set (R ,
"lastIndex" , 𝔽 (nextIndex ),
true )를 수행한다.
CreateIteratorResultObject (match ,
false )를 반환한다.
22.2.9.2.2 %RegExpStringIteratorPrototype% [
%Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기값은
문자열 값 "RegExp String Iterator" 이다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }이다.
22.2.9.3 RegExp 문자열 반복자 인스턴스의 속성
RegExp 문자열 반복자
인스턴스는 일반
객체 이며,
%RegExpStringIteratorPrototype%
내재 객체로부터 속성을 상속받는다. RegExp 문자열 반복자
인스턴스는 표 73 에 나열된 내부 슬롯으로
초기화된다.
표 73: RegExp 문자열
반복자 인스턴스의 내부 슬롯
내부 슬롯(Internal Slot)
타입(Type)
설명(Description)
[[IteratingRegExp]]
객체(Object)
반복에 사용되는 정규표현식.
IsRegExp ([[IteratingRegExp]] )는 처음에
true 이다.
[[IteratedString]]
문자열(String)
반복 대상이 되는 문자열 값.
[[Global]]
Boolean
[[IteratingRegExp]] 가 글로벌인지 여부.
[[Unicode]]
Boolean
[[IteratingRegExp]] 가 유니코드 모드인지 여부.
[[Done]]
Boolean
반복이 완료되었는지 여부.
23 인덱스된 컬렉션
23.1 배열 객체
배열은 특수
객체 로, 특정 클래스의 프로퍼티 이름에 대해 특별한 처리를 합니다. 이 특별한 처리의 정의는
10.4.2 에서 확인할 수 있습니다.
23.1.1 Array 생성자
Array 생성자 는
다음과 같습니다:
%Array% 입니다.
"Array" 프로퍼티의 초기값이며, 글로벌
객체 의 프로퍼티입니다.
생성자 로 호출될
때 새로운 배열을 생성하고 초기화합니다.
생성자 가 아닌
함수로 호출될 때에도 새로운 배열을 생성하고 초기화합니다. 따라서
Array(…) 함수 호출은 같은 인수를 사용한 new Array(…) 객체 생성 표현식과 동일합니다.
인수의 개수와 타입에 따라 동작이 달라지는 함수입니다.
클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 특수 배열 동작을 상속하려는
생성자 의 하위
클래스는 Array
생성자 를
super로 호출하여 배열 특수 객체 인 하위 클래스 인스턴스를
초기화해야 합니다. 하지만 대부분의 Array.prototype 메서드는 일반 메서드이므로
this 값이 배열 특수
객체 인지에 의존하지 않습니다.
23.1.1.1 Array ( ...values )
이 함수가 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면, newTarget 을 현재 활성 함수 객체 로 설정하고, 그렇지 않으면
newTarget 을 NewTarget으로 설정합니다.
proto 를 ? GetPrototypeFromConstructor (newTarget ,
"%Array.prototype%" )로 설정합니다.
numberOfArgs 를 values 의 요소 개수로 설정합니다.
numberOfArgs = 0이면,
! ArrayCreate (0,
proto )를 반환합니다.
그렇지 않고 numberOfArgs = 1이면,
len 을 values [0]으로 설정합니다.
array 를 ! ArrayCreate (0,
proto )로 설정합니다.
len 이 Number 타입이
아니라면 ,
! CreateDataPropertyOrThrow (array ,
"0" , len )을 수행합니다.
intLen 을 1 𝔽 로 설정합니다.
그렇지 않으면,
intLen 을 ! ToUint32 (len )로
설정합니다.
SameValueZero (intLen ,
len )이 false 이면,
RangeError 예외를 발생시킵니다.
! Set (array ,
"length" , intLen , true )을
수행합니다.
array 를 반환합니다.
그 밖의 경우,
Assert : numberOfArgs ≥ 2임을
확인합니다.
array 를 ? ArrayCreate (numberOfArgs ,
proto )로 설정합니다.
k 를 0으로 설정합니다.
k < numberOfArgs 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
itemK 를 values [k ]로 설정합니다.
! CreateDataPropertyOrThrow (array ,
Pk , itemK )를 수행합니다.
k 를 k + 1로 설정합니다.
Assert : 수학적 값
array 의 "length" 프로퍼티는
numberOfArgs 와 같습니다.
array 를 반환합니다.
23.1.2 Array 생성자의 속성
Array 생성자 는
다음과 같습니다:
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype% 입니다.
"length" 프로퍼티를 가지며, 그 값은 1 𝔽 입니다.
다음과 같은 프로퍼티들을 포함합니다:
23.1.2.1 Array.from ( items [ , mapper [ ,
thisArg ] ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
C 를 this 값으로 설정합니다.
mapper 가 undefined 라면,
mapping 을 false 로 설정합니다.
그렇지 않으면,
IsCallable (mapper )
가 false 라면, TypeError 예외를 throw합니다.
mapping 을 true 로 설정합니다.
usingIterator 를 ? GetMethod (items , %Symbol.iterator% )로 설정합니다.
usingIterator 가 undefined 가 아니면,
IsConstructor (C )
가 true 라면,
A 를 ? Construct (C )로
설정합니다.
그렇지 않으면,
A 를 ! ArrayCreate (0)로
설정합니다.
iteratorRecord 를 ? GetIteratorFromMethod (items ,
usingIterator )로 설정합니다.
k 를 0으로 설정합니다.
반복합니다,
k ≥ 253 - 1이면,
error 를 ThrowCompletion (새로
생성된 TypeError 객체)로 설정합니다.
? IteratorClose (iteratorRecord ,
error )를 반환합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
next 를 ? IteratorStepValue (iteratorRecord )로
설정합니다.
next 가 done 이면,
? Set (A ,
"length" , 𝔽 (k ),
true )을 수행합니다.
A 를 반환합니다.
mapping 이 true 이면,
mappedValue 를 Completion (Call (mapper ,
thisArg , « next , 𝔽 (k ) »))로
설정합니다.
IfAbruptCloseIterator (mappedValue ,
iteratorRecord )를 수행합니다.
그렇지 않으면,
mappedValue 를 next 로 설정합니다.
defineStatus 를 Completion (CreateDataPropertyOrThrow (A ,
Pk , mappedValue ))로 설정합니다.
IfAbruptCloseIterator (defineStatus ,
iteratorRecord )를 수행합니다.
k 를 k + 1로 설정합니다.
참고: items 는 iterable 이 아니므로
array-like 객체 라고 가정합니다.
arrayLike 를 ! ToObject (items )로 설정합니다.
len 을 ? LengthOfArrayLike (arrayLike )로
설정합니다.
IsConstructor (C )가
true 라면,
A 를 ? Construct (C , «
𝔽 (len ) »)로 설정합니다.
그렇지 않으면,
A 를 ? ArrayCreate (len )로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
mapping 이 true 라면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로 설정합니다.
그렇지 않으면,
mappedValue 를 kValue 로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , mappedValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (len ), true )를
수행합니다.
A 를 반환합니다.
참고
이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자 일
필요는 없습니다. 따라서 이 메서드는
다른 생성자 로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수
있습니다.
23.1.2.2 Array.isArray ( arg )
이 함수는 호출될 때 다음 단계들을 수행합니다:
? IsArray (arg )를 반환합니다.
23.1.2.3 Array.of ( ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
len 을 items 의 요소 개수로 설정합니다.
lenNumber 를 𝔽 (len )으로 설정합니다.
C 를 this 값으로 설정합니다.
IsConstructor (C )가
true 라면,
A 를 ? Construct (C , «
lenNumber »)로 설정합니다.
그렇지 않으면,
A 를 ? ArrayCreate (len )로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
kValue 를 items [k ]로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , kValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , lenNumber , true )를 수행합니다.
A 를 반환합니다.
참고
이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자 일
필요는 없습니다. 따라서 이 메서드는
다른 생성자 로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수
있습니다.
23.1.2.4 Array.prototype
Array.prototype의 값은 Array 프로토타입
객체 입니다.
이 프로퍼티는 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false } 속성을 가집니다.
23.1.2.5 get Array [ %Symbol.species% ]
Array[%Symbol.species%]는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출될 때 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get
[Symbol.species]" 입니다.
참고
Array 프로토타입 메서드는 일반적으로 this 값의 생성자 를 사용하여 파생 객체를 생성합니다.
하지만 하위 클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의함으로써
기본 동작을 오버라이드할 수 있습니다.
23.1.3 Array 프로토타입 객체의 속성
배열 프로토타입 객체 :
%Array.prototype% 입니다.
배열 특수
객체 이며, 해당 객체에 지정된 내부 메서드를 가집니다.
"length" 프로퍼티를 가지며, 초기 값은 +0 𝔽 이고 속성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }입니다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 입니다.
참고
배열 프로토타입 객체는 배열 특수 객체 로 지정되어 있는데, 이는 ECMAScript
2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위함입니다.
23.1.3.1 Array.prototype.at ( index )
O 를 ? ToObject (this 값)로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면,
k 를 relativeIndex 로 설정합니다.
그렇지 않으면,
k 를 len + relativeIndex 로 설정합니다.
k < 0 또는 k ≥ len 이면 undefined 를
반환합니다.
? Get (O , ! ToString (𝔽 (k )))를 반환합니다.
23.1.3.2 Array.prototype.concat ( ...items )
이 메서드는 객체의 배열 요소 뒤에 각 인자의 배열 요소를 담은 배열을 반환합니다.
호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)로
설정합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
n 을 0으로 설정합니다.
O 를 items 앞에 추가합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
spreadable 를 ? IsConcatSpreadable (E )로
설정합니다.
spreadable 이 true 이면,
len 를 ? LengthOfArrayLike (E )로
설정합니다.
n + len > 253 - 1이면
TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
exists 를 ? HasProperty (E ,
Pk )로 설정합니다.
exists 가 true 이면,
subElement 를 ? Get (E ,
Pk )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
subElement )를 수행합니다.
n 을 n + 1로 설정합니다.
k 를 k + 1로 설정합니다.
그렇지 않으면,
참고: E 는 펼쳐지지 않고 단일 항목으로 추가됩니다.
n ≥ 253 - 1이면 TypeError 예외를
throw합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )), E )를
수행합니다.
n 을 n + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (n ), true )를 수행합니다.
A 를 반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고 1
단계 6 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 items 의 마지막 비어 있지 않은 요소에
후행 구멍이 있거나 A 가 내장 배열이 아닐 때 길이가 올바르게 되도록 보장하기 위함입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.2.1 IsConcatSpreadable ( O )
추상 연산 IsConcatSpreadable은 인수 O (ECMAScript 언어
값 )를 받고, Boolean을 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
O 가 객체가 아니면 false 를
반환합니다.
spreadable 를 ? Get (O ,
%Symbol.isConcatSpreadable% )로
설정합니다.
spreadable 가 undefined 가 아니면 ToBoolean (spreadable )를
반환합니다.
? IsArray (O )를 반환합니다.
23.1.3.3 Array.prototype.constructor
Array.prototype.constructor의 초기 값은 %Array% 입니다.
23.1.3.4 Array.prototype.copyWithin ( target ,
start [ , end ] )
참고 1
end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.
참고 2
target 이 음수이면 length +
target 으로 처리됩니다. 여기서 length 는 배열의 길이입니다.
start 가 음수이면 length +
start 으로 처리됩니다. end 가 음수이면 length + end 으로 처리됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeTarget 를 ? ToIntegerOrInfinity (target )로
설정합니다.
relativeTarget = -∞이면 to 를 0으로 설정합니다.
그렇지 않고 relativeTarget < 0이면 to 를 max (len +
relativeTarget , 0)으로 설정합니다.
그 밖의 경우 to 를 min (relativeTarget ,
len )으로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 from 을 0으로 설정합니다.
그렇지 않고 relativeStart < 0이면 from 을 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 from 을 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그렇지 않고 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
count 를 min (final - from ,
len - to )로 설정합니다.
from < to 이고 to < from +
count 이면,
direction 을 -1로 설정합니다.
from 을 from + count - 1로 설정합니다.
to 를 to + count - 1로 설정합니다.
그렇지 않으면,
direction 을 1로 설정합니다.
count > 0인 동안 반복합니다,
fromKey 를 ! ToString (𝔽 (from ))로
설정합니다.
toKey 를 ! ToString (𝔽 (to ))로 설정합니다.
fromPresent 를 ? HasProperty (O ,
fromKey )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
fromKey )로 설정합니다.
? Set (O ,
toKey , fromValue , true )를
수행합니다.
그렇지 않으면,
Assert : fromPresent
이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
toKey )를 수행합니다.
from 을 from + direction 으로 설정합니다.
to 를 to + direction 으로 설정합니다.
count 를 count - 1로 설정합니다.
O 를 반환합니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.5 Array.prototype.entries ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
key+value )를 반환합니다.
23.1.3.6 Array.prototype.every ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
every는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 false 를 반환하는 요소를 찾으면 즉시
false 를 반환합니다. 그렇지 않으면 every는
true 를 반환합니다. callback 은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에
대해 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
every는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
every가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
every 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된
경우 every가 그 요소를 방문할 때의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는
방문하지 않습니다. every는 수학의 "모든 것에 대해(for all)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해
true 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 false 이면
false 를 반환합니다.
k 를 k + 1로 설정합니다.
true 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.7 Array.prototype.fill ( value [ ,
start [ , end ] ] )
참고 1
start 인수는 선택 사항입니다. 제공되지 않을 경우 +0 𝔽 가 사용됩니다.
end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.
참고 2
start 가 음수이면 length +
start 으로 처리됩니다. 여기서 length 는 배열의 길이입니다.
end 가 음수이면 length +
end 으로 처리됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 k 를 0으로 설정합니다.
그렇지 않고 relativeStart < 0이면 k 를 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 k 를 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그렇지 않고 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
k < final 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? Set (O , Pk ,
value , true )를 수행합니다.
k 를 k + 1로 설정합니다.
O 를 반환합니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.8 Array.prototype.filter ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
filter는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 true 를 반환하는 값들로 새로운 배열을 만듭니다.
callback 은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에 대해 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
filter는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
filter가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
filter 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 filter가 그 요소를 방문할 때의 값이 callback 에 전달됩니다. 호출이 시작된 후
삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
k 를 0으로 설정합니다.
to 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
selected 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
selected 이 true 이면,
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (to )),
kValue )를 수행합니다.
to 를 to + 1로 설정합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.9 Array.prototype.find ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을
반환합니다. 그렇지 않으면 find는 undefined 를 반환합니다.
자세한 내용은 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.10 Array.prototype.findIndex ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를
반환합니다. 그렇지 않으면 findIndex는 -1을 반환합니다.
자세한 내용은 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.11 Array.prototype.findLast ( predicate [ ,
thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을
반환합니다. 그렇지 않으면 findLast는 undefined 를 반환합니다.
자세한 정보는 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의
객체에 메서드로 전달하여 사용할 수 있습니다.
23.1.3.12 Array.prototype.findLastIndex ( predicate [
, thisArg ] )
참고 1
이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate 를 한 번씩 호출하며,
predicate 가 true 로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를
반환합니다. 그렇지 않으면 findLastIndex는 -1을 반환합니다.
자세한 정보는 FindViaPredicate 를 참조하세요.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의
객체에 메서드로 전달하여 사용할 수 있습니다.
23.1.3.12.1 FindViaPredicate ( O , len ,
direction , predicate , thisArg )
추상 연산 FindViaPredicate는 인수 O (객체), len (음이 아닌 정수 ),
direction (ascending 또는
descending ), predicate (ECMAScript 언어 값 ),
thisArg (ECMAScript 언어 값 )를 받고,
아래와 같은 필드를 가진 Record를 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다.
O 는 array-like 객체 또는 TypedArray 여야
합니다.
이 연산은 O 의 각 요소에 대해 오름차순 또는 내림차순 인덱스 순서(direction 에 따라)로
predicate 를 한 번씩 호출하며, predicate 가 true 로 변환되는 값을
반환하는 요소를 찾으면 해당 인덱스와 값을 담은 Record를 반환합니다. 그렇지 않으면 인덱스가
-1 𝔽 이고 값이 undefined 인 Record를 반환합니다.
predicate 는 함수여야 하며, 배열의 각 요소에 대해 호출될 때 요소의 값, 인덱스, 순회 중인 객체를 인수로 전달받고, 반환값은
Boolean으로 변환됩니다.
thisArg 는 predicate 호출 시 this 값으로 사용됩니다.
이 연산은 호출된 객체를 직접 변경하지 않지만, predicate 의 호출로 인해 객체가 변경될 수 있습니다.
처리되는 요소의 범위는 predicate 의 첫 호출 직전에 결정됩니다. 그 이후 배열에 추가된 요소는
predicate 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 predicate 에 전달됩니다. 순회
시작 이후 삭제된 요소는 여전히 방문되며 프로토타입에서 조회되거나 undefined 가 됩니다.
호출될 때 다음 단계들을 수행합니다:
IsCallable (predicate )가
false 이면 TypeError 예외를 throw합니다.
direction 이 ascending 이면,
indices 를 0(포함)부터 len (제외)까지의 정수 로 이루어진 구간 의 List 로,
오름차순으로 설정합니다.
그 밖의 경우,
indices 를 0(포함)부터 len (제외)까지의 정수 로 이루어진 구간 의 List 로,
내림차순으로 설정합니다.
indices 의 각 정수 k 에 대해, 다음을 수행합니다:
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
참고: O 가 TypedArray 일 경우, 이후 Get
호출은 정상 완료를 반환합니다.
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ? Call (predicate ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
ToBoolean (testResult )가
true 이면, Record
{ [[Index]] : 𝔽 (k ), [[Value]] : kValue }를 반환합니다.
Record {
[[Index]] : -1 𝔽 , [[Value]] : undefined }를 반환합니다.
23.1.3.13 Array.prototype.flat ( [ depth ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
sourceLen 를 ? LengthOfArrayLike (O )로 설정합니다.
depthNum 을 1로 설정합니다.
depth 가 undefined 가 아니면,
depthNum 을 ? ToIntegerOrInfinity (depth )로
설정합니다.
depthNum < 0이면 depthNum 을 0으로 설정합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
? FlattenIntoArray (A ,
O , sourceLen , 0, depthNum )를 수행합니다.
A 를 반환합니다.
23.1.3.13.1 FlattenIntoArray ( target ,
source , sourceLen , start , depth [ ,
mapperFunction [ , thisArg ] ] )
추상 연산 FlattenIntoArray는 인수 target (객체), source (객체),
sourceLen (음이 아닌 정수 ), start (음이 아닌 정수 ),
depth (음이 아닌 정수 또는 +∞)와 선택적 인수
mapperFunction (함수 객체 ), thisArg (ECMAScript 언어 값 )를 받고,
음이 아닌 정수를 포함하는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert : mapperFunction 이 존재하면
IsCallable (mapperFunction )이
true 이고, thisArg 가 존재하며, depth 가 1입니다.
targetIndex 를 start 로 설정합니다.
sourceIndex 를 +0 𝔽 로 설정합니다.
ℝ (sourceIndex ) <
sourceLen 인 동안 반복합니다,
P 를 ! ToString (sourceIndex )로
설정합니다.
exists 를 ? HasProperty (source ,
P )로 설정합니다.
exists 가 true 이면,
element 를 ? Get (source ,
P )로 설정합니다.
mapperFunction 이 존재하면,
element 를 ? Call (mapperFunction ,
thisArg , « element ,
sourceIndex , source »)로
설정합니다.
shouldFlatten 을 false 로 설정합니다.
depth > 0이면,
shouldFlatten 을 ? IsArray (element )로
설정합니다.
shouldFlatten 이 true 이면,
depth = +∞이면 newDepth 를 +∞로 설정합니다.
그 밖의 경우 newDepth 를 depth - 1로
설정합니다.
elementLen 를 ? LengthOfArrayLike (element )로
설정합니다.
targetIndex 를 ? FlattenIntoArray (target ,
element , elementLen ,
targetIndex , newDepth )로 설정합니다.
그 밖의 경우,
targetIndex ≥ 253 - 1이면
TypeError 예외를 throw합니다.
? CreateDataPropertyOrThrow (target ,
! ToString (𝔽 (targetIndex )),
element )를 수행합니다.
targetIndex 를 targetIndex + 1로
설정합니다.
sourceIndex 를 sourceIndex +
1 𝔽 로 설정합니다.
targetIndex 를 반환합니다.
23.1.3.14 Array.prototype.flatMap ( mapperFunction [
, thisArg ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
sourceLen 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (mapperFunction )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O , 0)로
설정합니다.
? FlattenIntoArray (A ,
O , sourceLen , 0, 1, mapperFunction ,
thisArg )를 수행합니다.
A 를 반환합니다.
23.1.3.15 Array.prototype.forEach ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받는 함수여야 합니다.
forEach는 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출합니다.
callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
forEach는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수
있습니다.
forEach가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
forEach 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)를 수행합니다.
k 를 k + 1로 설정합니다.
undefined 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.16 Array.prototype.includes ( searchElement [
, fromIndex ] )
참고 1
이 메서드는 SameValueZero 알고리즘을 사용하여
searchElement 를 배열 요소와 오름차순으로 비교하며, 아무 위치에서라도 찾으면 true 를
반환하고 그렇지 않으면 false 를 반환합니다.
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 +0 𝔽 입니다(즉,
배열 전체를 검색함). 배열 길이보다 크거나 같으면 false 를 반환하며, 검색하지 않습니다.
-0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex 를
계산합니다. 계산된 인덱스가 +0 𝔽 이하이면 배열 전체가 검색됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 false 를 반환합니다.
n 을 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 false 를 반환합니다.
그 밖의 경우 n = -∞이면 n 을 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
elementK 를 ? Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
SameValueZero (searchElement ,
elementK )이 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
참고 3
이 메서드는 유사한 indexOf 메서드와 두 가지 방식에서 의도적으로 다릅니다. 첫째로 SameValueZero 알고리즘을 사용하여 IsStrictlyEqual 대신
NaN 배열 요소를 감지할 수 있습니다. 둘째로 누락된 배열 요소를 건너뛰지 않고
undefined 로 처리합니다.
23.1.3.17 Array.prototype.indexOf ( searchElement [ ,
fromIndex ] )
이 메서드는 IsStrictlyEqual 알고리즘을 사용하여
searchElement 를 배열 요소와 오름차순으로 비교하며, 한 곳 이상에서 찾으면 가장 작은 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환합니다.
참고 1
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 +0 𝔽 입니다(즉,
배열 전체가 검색됨). 배열 길이보다 크거나 같으면 -1 𝔽 를 반환하며, 검색하지 않습니다.
-0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex 를
계산합니다. 계산된 인덱스가 +0 𝔽 이하이면 배열 전체가 검색됩니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
n 을 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 -1 𝔽 를 반환합니다.
그 밖의 경우 n = -∞이면 n 을 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
elementK 를 ? Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )이 true 이면 𝔽 (k )를
반환합니다.
k 를 k + 1로 설정합니다.
-1 𝔽 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.18 Array.prototype.join ( separator )
이 메서드는 배열의 요소들을 문자열로 변환한 후, separator 가 등장하는 구분자로 문자열을 연결합니다. separator가 제공되지 않으면
쉼표 하나가 구분자로 사용됩니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
separator 가 undefined 이면 sep 을
"," 로 설정합니다.
그 밖의 경우, sep 를 ? ToString (separator )로 설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 에 sep 를 문자열 연결하여 R 에
저장합니다.
element 를 ? Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 도 아니고
null 도 아니면,
S 를 ? ToString (element )로
설정합니다.
R 에 S 를 문자열 연결하여 R 에 저장합니다.
k 를 k + 1로 설정합니다.
R 를 반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.19 Array.prototype.keys ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
key )를 반환합니다.
23.1.3.20 Array.prototype.lastIndexOf ( searchElement
[ , fromIndex ] )
참고 1
이 메서드는 IsStrictlyEqual 알고리즘을 사용하여
searchElement 를 배열 요소와 내림차순으로 비교하며, 한 곳 이상에서 찾으면 가장 큰 인덱스를 반환하고, 그렇지 않으면
-1 𝔽 를 반환합니다.
두 번째 인수 fromIndex 는 선택 사항이며 기본값은 배열 길이 - 1입니다(즉, 배열 전체가 검색됨). 배열 길이보다 크거나
같으면 전체 배열을 검색합니다. -0 𝔽 보다 작으면 배열 끝에서의 오프셋으로 사용되어
fromIndex 를 계산합니다. 계산된 인덱스가 +0 𝔽 이하이면
-1 𝔽 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
fromIndex 가 존재하면 n 을 ? ToIntegerOrInfinity (fromIndex )로
설정하고 그렇지 않으면 n 을 len - 1로 설정합니다.
n = -∞이면 -1 𝔽 를 반환합니다.
n ≥ 0이면,
k 를 min (n , len -
1)로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
elementK 를 ? Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )이 true 이면 𝔽 (k )를
반환합니다.
k 를 k - 1로 설정합니다.
-1 𝔽 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.21 Array.prototype.map ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받는 함수여야 합니다.
map은 배열의 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며, 결과로 새로운 배열을
만듭니다. callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
map은 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
map이 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다. map
호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이
callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O ,
len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
mappedValue 를 ? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
? CreateDataPropertyOrThrow (A ,
Pk , mappedValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.22 Array.prototype.pop ( )
참고 1
이 메서드는 배열의 마지막 요소를 제거하고 해당 요소를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면,
? Set (O ,
"length" , +0 𝔽 ,
true )를 수행합니다.
undefined 를 반환합니다.
그 밖의 경우,
Assert : len > 0임을 확인합니다.
newLen 을 𝔽 (len - 1)로 설정합니다.
index 를 ! ToString (newLen )로
설정합니다.
element 를 ? Get (O ,
index )로 설정합니다.
? DeletePropertyOrThrow (O ,
index )를 수행합니다.
? Set (O ,
"length" , newLen , true )를
수행합니다.
element 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.23 Array.prototype.push ( ...items )
참고 1
이 메서드는 인수들을 배열의 끝에 등장 순서대로 추가합니다. 그리고 배열의 새 길이를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
argCount 를 items 의 요소 개수로 설정합니다.
len + argCount > 253 - 1이면
TypeError 예외를 throw합니다.
items 의 각 요소 E 에 대해 다음을 수행합니다:
? Set (O ,
! ToString (𝔽 (len )),
E , true )를 수행합니다.
len 을 len + 1로 설정합니다.
? Set (O ,
"length" , 𝔽 (len ), true )를
수행합니다.
𝔽 (len )를
반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.24 Array.prototype.reduce ( callback [ ,
initialValue ] )
참고 1
callback 은 네 개의 인수를 받는 함수여야 합니다.
reduce는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 오름차순으로 callback 을 한 번씩
함수로 호출합니다.
callback 은 네 개의 인수(previousValue (이전 callback 호출 값),
currentValue (현재 요소의 값), currentIndex , 순회 중인 객체)를 받아 호출됩니다.
callback 이 처음 호출될 때 previousValue 와 currentValue 는 두
가지 값 중 하나가 될 수 있습니다. reduce 호출 시 initialValue 가 제공되면
previousValue 는 initialValue 이고 currentValue 는 배열의 첫
번째 값이 됩니다. initialValue 가 제공되지 않으면 previousValue 는 배열의 첫 번째 값,
currentValue 는 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue 가 제공되지 않으면
TypeError 가 발생합니다.
reduce는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
reduce가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
reduce 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가
변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 0으로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
kPresent 를 false 로 설정합니다.
kPresent 가 false 이고 k <
len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
accumulator 를 ? Get (O ,
Pk )로 설정합니다.
k 를 k + 1로 설정합니다.
kPresent 이 false 이면 TypeError
예외를 throw합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator ,
kValue , 𝔽 (k ),
O »)로 설정합니다.
k 를 k + 1로 설정합니다.
accumulator 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.25 Array.prototype.reduceRight ( callback [ ,
initialValue ] )
참고 1
callback 은 네 개의 인수를 받는 함수여야 합니다.
reduceRight는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 내림차순으로 callback 을
한 번씩 함수로 호출합니다.
callback 은 네 개의 인수(previousValue (이전 callback 호출 값),
currentValue (현재 요소의 값), currentIndex , 순회 중인 객체)를 받아 호출됩니다. 함수가
처음 호출될 때 previousValue 와 currentValue 는 두 가지 값 중 하나가 될 수 있습니다.
reduceRight 호출 시 initialValue 가 제공되면
previousValue 는 initialValue 이고 currentValue 는 배열의 마지막
값이 됩니다. initialValue 가 제공되지 않으면 previousValue 는 배열의 마지막 값,
currentValue 는 마지막에서 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue 가 제공되지
않으면 TypeError 가 발생합니다.
reduceRight는 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수
있습니다.
reduceRight가 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다.
reduceRight 호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존
요소가 callback 에 의해 변경된 경우 그 시점의 값이 callback 에 전달됩니다. 호출이 시작된 후
삭제된 요소는 방문하지 않습니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 len - 1로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
kPresent 를 false 로 설정합니다.
kPresent 가 false 이고 k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
accumulator 를 ? Get (O ,
Pk )로 설정합니다.
k 를 k - 1로 설정합니다.
kPresent 이 false 이면 TypeError
예외를 throw합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator ,
kValue , 𝔽 (k ),
O »)로 설정합니다.
k 를 k - 1로 설정합니다.
accumulator 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.26 Array.prototype.reverse ( )
참고 1
이 메서드는 배열의 요소들을 순서를 반대로 재배열합니다. 그리고 뒤집힌 배열을 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
middle 를 floor (len / 2)로 설정합니다.
lower 를 0으로 설정합니다.
lower ≠ middle 인 동안 반복합니다,
upper 를 len - lower - 1로 설정합니다.
upperP 를 ! ToString (𝔽 (upper ))로
설정합니다.
lowerP 를 ! ToString (𝔽 (lower ))로
설정합니다.
lowerExists 를 ? HasProperty (O ,
lowerP )로 설정합니다.
lowerExists 이 true 이면,
lowerValue 를 ? Get (O ,
lowerP )로 설정합니다.
upperExists 를 ? HasProperty (O ,
upperP )로 설정합니다.
upperExists 이 true 이면,
upperValue 를 ? Get (O ,
upperP )로 설정합니다.
lowerExists 이 true 이고
upperExists 이 true 이면,
? Set (O ,
lowerP , upperValue , true )를
수행합니다.
? Set (O ,
upperP , lowerValue , true )를
수행합니다.
그 밖의 경우 lowerExists 이 false 이고
upperExists 이 true 이면,
? Set (O ,
lowerP , upperValue , true )를
수행합니다.
? DeletePropertyOrThrow (O ,
upperP )를 수행합니다.
그 밖의 경우 lowerExists 이 true 이고
upperExists 이 false 이면,
? DeletePropertyOrThrow (O ,
lowerP )를 수행합니다.
? Set (O ,
upperP , lowerValue , true )를
수행합니다.
그 밖의 경우,
Assert : lowerExists
와 upperExists 가 모두 false 임을 확인합니다.
참고: 아무 작업도 필요하지 않습니다.
lower 를 lower + 1로 설정합니다.
O 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.27 Array.prototype.shift ( )
이 메서드는 배열의 첫 번째 요소를 제거하고 해당 요소를 반환합니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
len = 0이면,
? Set (O ,
"length" , +0 𝔽 ,
true )를 수행합니다.
undefined 를 반환합니다.
first 를 ? Get (O ,
"0" )로 설정합니다.
k 를 1로 설정합니다.
k < len 인 동안 반복합니다,
from 을 ! ToString (𝔽 (k ))로 설정합니다.
to 를 ! ToString (𝔽 (k - 1))로
설정합니다.
fromPresent 를 ? HasProperty (O ,
from )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue , true )를
수행합니다.
그 밖의 경우,
Assert : fromPresent
이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k + 1로 설정합니다.
? DeletePropertyOrThrow (O ,
! ToString (𝔽 (len - 1)))를 수행합니다.
? Set (O ,
"length" , 𝔽 (len - 1), true )를
수행합니다.
first 를 반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.28 Array.prototype.slice ( start ,
end )
이 메서드는 배열의 start 요소부터 end 요소 바로 앞까지(혹은 end 가
undefined 이면 배열의 끝까지)의 요소를 포함하는 배열을 반환합니다. start 가 음수면 length + start 로 처리되며, 여기서
length 는 배열의 길이입니다. end 가 음수면 length
+ end 로 처리됩니다. 여기서 length 는 배열의 길이입니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 k 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 k 를 max (len +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 k 를 min (relativeStart ,
len )으로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
count 를 max (final - k , 0)으로
설정합니다.
A 를 ? ArraySpeciesCreate (O ,
count )로 설정합니다.
n 을 0으로 설정합니다.
k < final 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (n )),
kValue )를 수행합니다.
k 를 k + 1로 설정합니다.
n 을 n + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (n ), true )를 수행합니다.
A 를 반환합니다.
참고 1
단계 15 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 A 가 내장 배열이 아닌 경우에도 길이가
올바르게 되도록 하기 위함입니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.29 Array.prototype.some ( callback [ ,
thisArg ] )
참고 1
callback 은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다.
some은 배열에 존재하는 각 요소에 대해 오름차순으로 callback 을 한 번씩 호출하며,
callback 이 true 를 반환하는 요소를 찾으면 즉시
true 를 반환합니다. 그렇지 않으면 some은 false 를
반환합니다. callback 은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.
thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.
some은 호출된 객체를 직접 변경하지 않지만, callback 의 호출로 인해 객체가 변경될 수 있습니다.
some이 처리할 요소의 범위는 callback 의 첫 호출 전에 결정됩니다. some
호출이 시작된 후 배열에 추가된 요소는 callback 에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이
callback 에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다. some은 수학의
"존재(exists)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해 false 를 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
IsCallable (callback )이
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ? HasProperty (O ,
Pk )로 설정합니다.
kPresent 이 true 이면,
kValue 를 ? Get (O ,
Pk )로 설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 이 true 이면
true 를 반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
참고 2
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.30 Array.prototype.sort ( comparator )
이 메서드는 배열의 요소를 정렬합니다. comparator 가 undefined 가 아니면 두 개의 인수
x , y 를 받아 x < y 이면 음수 Number, x >
y 이면 양수 Number, 그렇지 않으면 0을 반환하는 함수여야 합니다.
호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가
아니며 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
obj 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (obj )로 설정합니다.
SortCompare 를 (x , y )를 매개변수로 하고
comparator 를 캡처하는 새로운 Abstract Closure 로
설정하며, 호출 시 다음을 수행합니다:
? CompareArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (obj ,
len , SortCompare , skip-holes )로 설정합니다.
itemCount 를 sortedList 의 요소 개수로 설정합니다.
j 를 0으로 설정합니다.
j < itemCount 인 동안 반복합니다,
? Set (obj ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
참고: 단계 SortIndexedProperties 호출은
skip-holes 를 사용합니다. 나머지 인덱스는 정렬에서 제외된 구멍의 개수를 보존하기 위해 삭제됩니다.
j < len 인 동안 반복합니다,
? DeletePropertyOrThrow (obj ,
! ToString (𝔽 (j )))를 수행합니다.
j 를 j + 1로 설정합니다.
obj 를 반환합니다.
참고 1
존재하지 않는 프로퍼티 값은 항상 undefined 프로퍼티 값보다 크고,
undefined 는 항상 다른 어떤 값보다 크므로(자세한 내용은 CompareArrayElements 참조),
undefined 프로퍼티 값은 항상 결과의 끝으로 정렬되고 그 뒤에 존재하지 않는 프로퍼티 값이 옵니다.
참고 2
단계 ToString 추상 연산 이
단계 5 및 6 에서 수행될 때
SortCompare 가 일관된 비교자 로 동작하지 않을 수도 있습니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.30.1 SortIndexedProperties ( obj ,
len , SortCompare , holes )
추상 연산 SortIndexedProperties는 인수 obj (객체), len (음이 아닌 정수 ),
SortCompare (두 개의 매개변수를 가진 Abstract Closure ),
holes (skip-holes 또는
read-through-holes )를 받고, 아래와 같은 값을 담는 정상
완료 또는 throw
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
items 를 새로 빈 List 로
설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
holes 가 skip-holes 이면,
kRead 를 ? HasProperty (obj ,
Pk )로 설정합니다.
그 밖의 경우,
Assert : holes
가 read-through-holes 임을 확인합니다.
kRead 를 true 로 설정합니다.
kRead 이 true 이면,
kValue 를 ? Get (obj ,
Pk )로 설정합니다.
kValue 를 items 에 추가합니다.
k 를 k + 1로 설정합니다.
items 를 구현 정의 순서의
calls to SortCompare 로 정렬합니다. 만약 호출 중
abrupt
completion 이 반환되면 더 이상 SortCompare 를 호출하지 않고 해당
Completion
Record 를 반환합니다.
items 를 반환합니다.
정렬 순서(sort order) 는 위 알고리즘의 단계 4 를
완료한 후 items 의 순서를 의미합니다.
정렬 순서 는
구현 정의 입니다. 만약
SortCompare 가 items 의 원소에 대해 일관된 비교자 가 아닌 경우입니다.
Array.prototype.sort 또는
Array.prototype.toSorted 에서
SortIndexedProperties가 호출될 때, 정렬 순서 는 구현
정의 입니다. 만약 comparator 가 undefined 이고,
ToString 이 SortCompare 에 인수로 넘긴 특정
값에 대해 항상 동일한 결과를 반환하지 않는 경우입니다.
정렬 순서 가
구현 정의 로 지정되지 않은 경우, 다음 조건을 모두 만족해야
합니다:
itemCount 보다 작은 음이 아닌 정수 에 대한 어떤 수학적 순열 π가 존재해야 하며,
itemCount 보다 작은 음이 아닌 정수 j 에 대해 old[j ] 는 new[π(j )] 와 정확히 동일해야 합니다.
itemCount 보다 작은 모든 음이 아닌 정수 j , k 에 대해, ℝ (SortCompare (old[j ],
old[k ])) < 0 이면 π(j )
< π(k ) 가 성립해야 합니다.
itemCount 보다 작은 j , k 에 대해 j <
k , ℝ (SortCompare (old[j ],
old[k ])) = 0 이면 π(j )
< π(k ) 가 성립해야 합니다. 즉, 정렬은 안정적(stable)이어야 합니다.
여기서 old[j ] 는 단계 4 실행
전 items [j ] 을, new[j ] 는 단계 4 실행 후의 items [j ] 을 의미합니다.
추상 클로저나 함수 comparator 가 집합 S 에 대해 일관된 비교자(consistent comparator) 라면, 모든 S 의 값
a , b , c (동일할 수도 있음)에 대해 아래의 조건을 모두 만족해야 합니다. a <C
b 는 ℝ (comparator (a ,
b )) < 0 을, a =C
b 는 ℝ (comparator (a ,
b )) = 0 을, a
>C b 는 ℝ (comparator (a ,
b )) > 0 을 의미합니다.
comparator (a , b )를 호출하면 주어진 a ,
b 쌍에 대해 항상 동일한 값 v 가 반환되어야 하며, v 는 Number 이며
v 는 NaN 이 아니어야 합니다. 즉, a <C
b , a =C b , a >C
b 중 하나만 참입니다.
comparator (a , b )를 호출해도 obj 나
obj 의 프로토타입 체인의 어떤 객체도 수정하면 안 됩니다.
a =C a (반사성)
a =C b 이면 b =C a
(대칭성)
a =C b 이고 b =C c 이면
a =C c (전이성)
a <C b 이고 b <C
c 이면 a <C c (전이성)
a >C b 이고 b >C
c 이면 a >C c (전이성)
참고
위 조건들은 comparator 가 집합 S 를 동치류(equivalence class)로 나누고, 그
동치류들이 완전히 정렬됨을 보장하기 위한 필요충분조건입니다.
23.1.3.30.2 CompareArrayElements ( x ,
y , comparator )
추상 연산 CompareArrayElements는 인수 x (ECMAScript 언어 값 ),
y (ECMAScript 언어 값 ),
comparator (함수 객체 또는 undefined )를
받고, 아래와 같은 값을 담는 정상
완료 또는 abrupt
완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
x 와 y 가 모두 undefined 이면
+0 𝔽 를 반환합니다.
x 가 undefined 이면 1 𝔽 를
반환합니다.
y 가 undefined 이면 -1 𝔽 를
반환합니다.
comparator 가 undefined 가 아니면,
v 를 ? ToNumber (? Call (comparator ,
undefined , « x , y »))로
설정합니다.
v 가 NaN 이면
+0 𝔽 를 반환합니다.
v 를 반환합니다.
xString 를 ? ToString (x )로 설정합니다.
yString 를 ? ToString (y )로 설정합니다.
xSmaller 를 ! IsLessThan (xString ,
yString , true )로 설정합니다.
xSmaller 이 true 이면
-1 𝔽 를 반환합니다.
ySmaller 를 ! IsLessThan (yString ,
xString , true )로 설정합니다.
ySmaller 이 true 이면
1 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
23.1.3.31 Array.prototype.splice ( start ,
deleteCount , ...items )
참고 1
이 메서드는 배열에서 start 정수 인덱스 부터 deleteCount 개의 요소를
삭제하고, 그 위치에 items 의 요소들을 대체합니다. 삭제된 요소들을 담은 배열(있는 경우)을 반환합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 actualStart 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 actualStart 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 actualStart 를 min (relativeStart ,
len )으로 설정합니다.
itemCount 를 items 의 요소 개수로 설정합니다.
start 가 제공되지 않으면,
actualDeleteCount 를 0으로 설정합니다.
그 밖의 경우 deleteCount 가 제공되지 않으면,
actualDeleteCount 를 len - actualStart 로
설정합니다.
그 밖의 경우,
dc 를 ? ToIntegerOrInfinity (deleteCount )로
설정합니다.
actualDeleteCount 를 클램핑(clamping) 연산으로 dc 를 0
과 len - actualStart 사이로 조정한 결과로 설정합니다.
len + itemCount - actualDeleteCount >
253 - 1이면 TypeError 예외를 throw합니다.
A 를 ? ArraySpeciesCreate (O ,
actualDeleteCount )로 설정합니다.
k 를 0으로 설정합니다.
k < actualDeleteCount 인 동안 반복합니다,
from 을 ! ToString (𝔽 (actualStart +
k ))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (k )),
fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (A ,
"length" , 𝔽 (actualDeleteCount ),
true )를 수행합니다.
itemCount < actualDeleteCount 이면,
k 를 actualStart 로 설정합니다.
k < (len -
actualDeleteCount )인 동안 반복합니다,
from 을 ! ToString (𝔽 (k +
actualDeleteCount ))로 설정합니다.
to 를 ! ToString (𝔽 (k +
itemCount ))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k + 1로 설정합니다.
k 를 len 으로 설정합니다.
k > (len -
actualDeleteCount + itemCount )인 동안 반복합니다,
? DeletePropertyOrThrow (O ,
! ToString (𝔽 (k - 1)))를 수행합니다.
k 를 k - 1로 설정합니다.
그 밖의 경우 itemCount > actualDeleteCount 이면,
k 를 (len - actualDeleteCount )로 설정합니다.
k > actualStart 인 동안 반복합니다,
from 을 ! ToString (𝔽 (k +
actualDeleteCount - 1))로 설정합니다.
to 를 ! ToString (𝔽 (k +
itemCount - 1))로 설정합니다.
? HasProperty (O ,
from )이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k - 1로 설정합니다.
k 를 actualStart 로 설정합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
? Set (O ,
! ToString (𝔽 (k )),
E , true )를 수행합니다.
k 를 k + 1로 설정합니다.
? Set (O ,
"length" , 𝔽 (len - actualDeleteCount +
itemCount ), true )를 수행합니다.
A 를 반환합니다.
참고 2
단계 15 및 20 에서
"length" 프로퍼티를 명시적으로 설정하는 것은 객체가 내장 배열이 아닐 때에도 길이가 올바르게 되도록 보장하기
위함입니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.32 Array.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 이 메서드는 ECMA-402 명세에 따라 구현되어야 합니다. ECMAScript 구현이
ECMA-402 API를 포함하지 않는 경우 다음 명세가 사용됩니다.
참고 1
ECMA-402의 첫 번째 판에는 이 메서드의 대체 명세가 포함되지 않았습니다.
이 메서드의 선택적 파라미터의 의미는 ECMA-402 명세에서 정의되며, ECMA-402를 지원하지 않는 구현에서는 해당 파라미터 위치를 다른 용도로 사용해서는 안
됩니다.
이 메서드는 호출될 때 다음 단계를 수행합니다:
array 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (array )로
설정합니다.
separator 를 구현 정의
리스트 구분자 문자열 값(예: ", " )으로, 호스트 환경 의 현재 로케일에 맞게
설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 을 R 과 separator 를
문자열 연결 한 값으로 설정합니다.
element 를 ? Get (array ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 도 아니고
null 도 아니면,
S 를 ? ToString (? Invoke (element ,
"toLocaleString" ))로 설정합니다.
R 을 R 과 S 를 문자열 연결 한 값으로
설정합니다.
k 를 k + 1로 설정합니다.
R 을 반환합니다.
참고 2
이 메서드는 배열의 각 요소의 toLocaleString 메서드를 사용하여 문자열로 변환하고, 구현 정의 로케일 민감 구분자
문자열로 연결합니다. 이 메서드는 toString과 유사하지만, 호스트 환경의 현재 로케일 관습에 맞는 로케일 민감 결과를
생성하기 위함입니다.
참고 3
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.33 Array.prototype.toReversed ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (O )로 설정합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
from 을 ! ToString (𝔽 (len -
k - 1))로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
fromValue 를 ? Get (O ,
from )로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pk , fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.1.3.34 Array.prototype.toSorted ( comparator )
이 메서드는 호출될 때 다음 단계를 수행합니다:
comparator 가 undefined 가 아니며 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
O 를 ? ToObject (this 값)으로
설정합니다.
len 을 ? LengthOfArrayLike (O )로 설정합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
SortCompare 를 (x , y )를 매개변수로 하고
comparator 를 캡처하는 새로운 Abstract Closure 로
설정하며, 호출 시 다음을 수행합니다:
? CompareArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (O ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! CreateDataPropertyOrThrow (A ,
! ToString (𝔽 (j )),
sortedList [j ])를 수행합니다.
j 를 j + 1로 설정합니다.
A 를 반환합니다.
23.1.3.35 Array.prototype.toSpliced ( start ,
skipCount , ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 actualStart 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 actualStart 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 actualStart 를 min (relativeStart ,
len )으로 설정합니다.
insertCount 를 items 의 요소 개수로 설정합니다.
start 가 제공되지 않으면,
actualSkipCount 를 0으로 설정합니다.
그 밖의 경우 skipCount 가 제공되지 않으면,
actualSkipCount 를 len - actualStart 로 설정합니다.
그 밖의 경우,
sc 를 ? ToIntegerOrInfinity (skipCount )로
설정합니다.
actualSkipCount 를 클램핑 연산으로 sc 를 0과
len - actualStart 사이로 조정한 값으로 설정합니다.
newLen 를 len + insertCount -
actualSkipCount 로 설정합니다.
newLen > 253 - 1이면 TypeError 예외를
throw합니다.
A 를 ? ArrayCreate (newLen )로
설정합니다.
i 를 0으로 설정합니다.
r 를 actualStart + actualSkipCount 로 설정합니다.
i < actualStart 인 동안 반복합니다,
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
iValue 를 ? Get (O , Pi )로
설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , iValue )를 수행합니다.
i 를 i + 1로 설정합니다.
items 의 각 요소 E 에 대해, 다음을 수행합니다:
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , E )를 수행합니다.
i 를 i + 1로 설정합니다.
i < newLen 인 동안 반복합니다,
Pi 를 ! ToString (𝔽 (i ))로 설정합니다.
from 을 ! ToString (𝔽 (r ))로 설정합니다.
fromValue 를 ? Get (O ,
from )로 설정합니다.
! CreateDataPropertyOrThrow (A ,
Pi , fromValue )를 수행합니다.
i 를 i + 1로 설정합니다.
r 를 r + 1로 설정합니다.
A 를 반환합니다.
23.1.3.36 Array.prototype.toString ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
array 를 ? ToObject (this 값)으로
설정합니다.
func 를 ? Get (array ,
"join" )로 설정합니다.
IsCallable (func )이
false 이면 func 를 내장 함수 %Object.prototype.toString%으로
설정합니다.
? Call (func , array )를
반환합니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.37 Array.prototype.unshift ( ...items )
이 메서드는 인수들을 배열의 시작 부분에 추가하며, 배열 내에서의 순서는 인수 목록에 나타나는 순서와 동일합니다.
호출 시 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
argCount 를 items 의 요소 개수로 설정합니다.
argCount > 0이면,
len + argCount > 253 - 1이면
TypeError 예외를 throw합니다.
k 를 len 으로 설정합니다.
k > 0인 동안 반복합니다,
from 을 ! ToString (𝔽 (k - 1))로 설정합니다.
to 를 ! ToString (𝔽 (k +
argCount - 1))로 설정합니다.
fromPresent 를 ? HasProperty (O ,
from )로 설정합니다.
fromPresent 이 true 이면,
fromValue 를 ? Get (O ,
from )로 설정합니다.
? Set (O ,
to , fromValue ,
true )를 수행합니다.
그 밖의 경우,
Assert :
fromPresent 이 false 임을 확인합니다.
? DeletePropertyOrThrow (O ,
to )를 수행합니다.
k 를 k - 1로 설정합니다.
j 를 +0 𝔽 로 설정합니다.
items 의 각 요소 E 에 대해 다음을 수행합니다:
? Set (O ,
! ToString (j ),
E , true )를 수행합니다.
j 를 j +
1 𝔽 로 설정합니다.
? Set (O ,
"length" , 𝔽 (len + argCount ),
true )를 수행합니다.
𝔽 (len +
argCount )를 반환합니다.
이 메서드의 "length" 프로퍼티 값은 1 𝔽 입니다.
참고
이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에
메서드로 전달하여 사용할 수 있습니다.
23.1.3.38 Array.prototype.values ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
CreateArrayIterator (O ,
value )를 반환합니다.
23.1.3.39 Array.prototype.with ( index ,
value )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 ? ToObject (this 값)으로
설정합니다.
len 를 ? LengthOfArrayLike (O )로 설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면 actualIndex 를 relativeIndex 로
설정합니다.
그 밖의 경우 actualIndex 를 len + relativeIndex 로 설정합니다.
actualIndex ≥ len 또는 actualIndex < 0이면
RangeError 예외를 throw합니다.
A 를 ? ArrayCreate (len )로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
k = actualIndex 이면 fromValue 를
value 로 설정합니다.
그 밖의 경우 fromValue 를 ? Get (O , Pk )로
설정합니다.
! CreateDataPropertyOrThrow (A ,
Pk , fromValue )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
23.1.3.38 에서 정의된
%Array.prototype.values%입니다.
23.1.3.41 Array.prototype [ %Symbol.unscopables% ]
%Symbol.unscopables% 데이터
프로퍼티 의 초기 값은 다음 단계로 생성된 객체입니다:
unscopableList 를 OrdinaryObjectCreate (null )로
설정합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"at" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"copyWithin" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"entries" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"fill" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"find" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findIndex" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findLast" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"findLastIndex" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"flat" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"flatMap" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"includes" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"keys" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toReversed" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toSorted" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"toSpliced" , true )를 수행합니다.
! CreateDataPropertyOrThrow (unscopableList ,
"values" , true )를 수행합니다.
unscopableList 를 반환합니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
참고
이 객체의 자신의 프로퍼티 이름들은 ECMAScript 2015 명세 이전에 Array.prototype의 표준 프로퍼티로
포함되지 않았던 프로퍼티 이름입니다. 이러한 이름들은 with 문 바인딩에서 무시되어, 외부 스코프에서 해당 이름을 바인딩으로
사용하는 기존 코드의 동작을 보존하기 위해 with 문에서 바인딩 객체가 배열일 때 그림자(shadow) 처리됩니다.
"with" 이 unscopableList 에 포함되지 않는 이유는 이미 예약어 이기 때문입니다.
23.1.4 배열 인스턴스의 속성
배열 인스턴스는 배열
이국 객체(Array exotic objects) 이며, 해당 객체에 지정된 내부 메서드를 가집니다. 배열 인스턴스는
Array 프로토타입 객체 로부터
프로퍼티를 상속받습니다.
배열 인스턴스는 "length" 프로퍼티와 배열 인덱스(array index) 이름을 가진 일련의 열거 가능한 프로퍼티를 가집니다.
23.1.4.1 length
배열 인스턴스의 "length" 프로퍼티는 데이터 프로퍼티 로, 그 값은 항상 모든 구성 가능한
자신의 배열 인덱스(array
index) 이름보다 숫자적으로 큽니다.
"length" 프로퍼티의 초기 속성은 { [[Writable]] :
true , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
참고
"length" 프로퍼티 값을 줄이면 이전 값과 새 값 사이에 있는 자신의 배열 요소가 삭제됩니다. 단, 구성 불가능한
프로퍼티는 삭제할 수 없습니다. 배열의 "length" 프로퍼티를 기존의 구성 불가능한 배열
인덱스(array-indexed) 프로퍼티의 가장 큰 숫자 이름 이하의 값으로 설정하려고 하면, 길이는 해당
구성 불가능한 숫자 자신의 프로퍼티 이름 보다 1 큰 숫자 값으로 설정됩니다. 자세한 내용은
10.4.2.1 을
참조하세요.
23.1.5 배열 이터레이터 객체
배열
이터레이터(Array Iterator) 는 특정 배열 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체입니다. 배열 이터레이터 객체에 대한
명명된 생성자(constructor) 는 존재하지 않습니다. 대신, 배열 이터레이터 객체는 배열 인스턴스
객체의 특정 메서드를 호출하여 생성됩니다.
23.1.5.1 CreateArrayIterator ( array , kind
)
추상 연산 CreateArrayIterator는 인수 array (객체)와
kind (key+value , key , 또는
value )를 받아 객체를 반환합니다. 이 연산은 해당 이터레이터
객체 를 반환하는 배열 메서드에서 이터레이터 객체를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:
iterator 를 OrdinaryObjectCreate (%ArrayIteratorPrototype% ,
« [[IteratedArrayLike]] , [[ArrayLikeNextIndex]] , [[ArrayLikeIterationKind]] »)로 설정합니다.
iterator .[[IteratedArrayLike]] 를
array 로 설정합니다.
iterator .[[ArrayLikeNextIndex]] 를 0으로 설정합니다.
iterator .[[ArrayLikeIterationKind]] 를
kind 로 설정합니다.
iterator 를 반환합니다.
23.1.5.2 %ArrayIteratorPrototype% 객체
%ArrayIteratorPrototype% 객체:
23.1.5.2.1 %ArrayIteratorPrototype%.next ( )
O 를 this 값으로 설정합니다.
O 가 객체가 아니면
TypeError 예외를 throw합니다.
O 가 배열 이터레이터 인스턴스의 모든 내부
슬롯을 가지고 있지 않으면 TypeError 예외를 throw합니다.
array 를 O .[[IteratedArrayLike]] 로
설정합니다.
array 가 undefined 이면 CreateIteratorResultObject (undefined ,
true )를 반환합니다.
index 를 O .[[ArrayLikeNextIndex]] 로
설정합니다.
kind 를 O .[[ArrayLikeIterationKind]] 로 설정합니다.
array 가 [[TypedArrayName]] 내부 슬롯을 가지고 있다면,
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (array ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )가
true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
그 밖의 경우,
len 를 ? LengthOfArrayLike (array )로
설정합니다.
index ≥ len 이면,
O .[[IteratedArrayLike]] 를
undefined 로 설정합니다.
CreateIteratorResultObject (undefined ,
true )를 반환합니다.
O .[[ArrayLikeNextIndex]] 를 index +
1로 설정합니다.
indexNumber 를 𝔽 (index )로 설정합니다.
kind 가 key 이면,
result 를 indexNumber 로 설정합니다.
그 밖의 경우,
elementKey 를 ! ToString (indexNumber )로
설정합니다.
elementValue 를 ? Get (array ,
elementKey )로 설정합니다.
kind 가 value 이면,
result 를 elementValue 로 설정합니다.
그 밖의 경우,
Assert : kind 가
key+value 임을 확인합니다.
result 를 CreateArrayFromList («
indexNumber , elementValue »)로 설정합니다.
CreateIteratorResultObject (result ,
false )를 반환합니다.
23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은
문자열 값 "Array Iterator" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }입니다.
23.1.5.3 배열 이터레이터 인스턴스의 속성
배열 이터레이터 인스턴스는 일반
객체 이며, %ArrayIteratorPrototype%
내재 객체로부터 프로퍼티를 상속받습니다. 배열 이터레이터 인스턴스는 표 74 에 나열된 내부
슬롯으로 초기화됩니다.
표 74: 배열 이터레이터 인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[IteratedArrayLike]]
객체 또는 undefined
반복 중인 배열 유사 객체(array-like
object)
입니다.
[[ArrayLikeNextIndex]]
0 이상의 정수
해당 이터레이터 에서 다음으로 검사할
정수 인덱스 입니다.
[[ArrayLikeIterationKind]]
key+value , key , 또는
value
반복의 각 요소에 대해 반환되는 값을 식별하는 값입니다.
23.2 TypedArray 객체
TypedArray 는 기본 이진 데이터 버퍼(25.1 )에 대한 배열 유사 뷰를 제공합니다. TypedArray 요소 타입 은 TypedArray
인스턴스의 모든 요소가 가지는 기본 이진 스칼라 데이터 타입입니다. 지원되는 각 요소 타입마다 생성자 가 별도로 존재하며, 이는 표 75 에 나열되어 있습니다. 표 75 의 각 생성자 마다 별도의 프로토타입 객체가
존재합니다.
표 75: TypedArray 생성자들
생성자 이름 및 내재 객체
요소 타입
요소 크기
변환 연산
설명
Int8Array
%Int8Array%
int8
1
ToInt8
8비트 2의 보수 부호 있는 정수
Uint8Array
%Uint8Array%
uint8
1
ToUint8
8비트 부호 없는 정수
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped
1
ToUint8Clamp
8비트 부호 없는 정수 (클램프 변환)
Int16Array
%Int16Array%
int16
2
ToInt16
16비트 2의 보수 부호 있는 정수
Uint16Array
%Uint16Array%
uint16
2
ToUint16
16비트 부호 없는 정수
Int32Array
%Int32Array%
int32
4
ToInt32
32비트 2의 보수 부호 있는 정수
Uint32Array
%Uint32Array%
uint32
4
ToUint32
32비트 부호 없는 정수
BigInt64Array
%BigInt64Array%
bigint64
8
ToBigInt64
64비트 2의 보수 부호 있는 정수
BigUint64Array
%BigUint64Array%
biguint64
8
ToBigUint64
64비트 부호 없는 정수
Float16Array
%Float16Array%
float16
2
16비트 IEEE 부동 소수점
Float32Array
%Float32Array%
float32
4
32비트 IEEE 부동 소수점
Float64Array
%Float64Array%
float64
8
64비트 IEEE 부동 소수점
아래 정의에서 TypedArray 라는 참조는 위 표에서 해당되는 생성자 이름으로 치환되어야 합니다.
23.2.1 %TypedArray% 내재 객체
%TypedArray% 내재 객체:
모든 TypedArray 생성자 객체가 상속하는 함수 객체 생성자 입니다.
해당 프로토타입 객체와 함께, 모든 TypedArray 생성자 와 그 인스턴스가 상속하는 공통 프로퍼티를 제공합니다.
전역
객체 의 프로퍼티로 나타나거나 전역 이름을 가지지 않습니다.
다양한 TypedArray 생성자 의 추상 상위 클래스 역할을 합니다.
추상 클래스 생성자 이므로 호출 시 오류를 throw합니다.
TypedArray 생성자 들은 super 호출을 수행하지 않습니다.
23.2.1.1 %TypedArray% ( )
이 함수는 호출될 때 다음 단계들을 수행합니다:
TypeError 예외를 throw합니다.
이 함수의 "length" 프로퍼티 값은
+0 𝔽 입니다.
23.2.2 %TypedArray% 내재 객체의 속성
%TypedArray% 내재 객체:
23.2.2.1 %TypedArray%.from ( source [ ,
mapper [ , thisArg ] ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
C 를 this 값으로 설정합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 throw합니다.
mapper 가 undefined 이면,
mapping 을 false 로 설정합니다.
그 밖의 경우,
IsCallable (mapper )
가 false 이면 TypeError 예외를 throw합니다.
mapping 을 true 로 설정합니다.
usingIterator 를 ? GetMethod (source , %Symbol.iterator% )로 설정합니다.
usingIterator 가 undefined 가 아니면,
values 를 ? IteratorToList (? GetIteratorFromMethod (source ,
usingIterator ))로 설정합니다.
len 을 values 의 요소 개수로 설정합니다.
targetObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 values 의 첫 번째 요소로 설정합니다.
values 의 첫 번째 요소를 제거합니다.
mapping 이 true 이면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로
설정합니다.
그 밖의 경우,
mappedValue 를 kValue 로 설정합니다.
? Set (targetObj ,
Pk , mappedValue , true )를
수행합니다.
k 를 k + 1로 설정합니다.
Assert : values 는 이제 빈
List 입니다.
targetObj 를 반환합니다.
참고: source 는 iterable 객체 가 아니므로, 이미
배열 유사 객체 라고 가정합니다.
arrayLike 를 ! ToObject (source )로 설정합니다.
len 를 ? LengthOfArrayLike (arrayLike )로
설정합니다.
targetObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
mapping 이 true 이면,
mappedValue 를 ? Call (mapper ,
thisArg , « kValue , 𝔽 (k ) »)로 설정합니다.
그 밖의 경우,
mappedValue 를 kValue 로 설정합니다.
? Set (targetObj ,
Pk , mappedValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
targetObj 를 반환합니다.
23.2.2.2 %TypedArray%.of ( ...items )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
len 을 items 의 요소 개수로 설정합니다.
C 를 this 값으로 설정합니다.
IsConstructor (C )가
false 이면 TypeError 예외를 throw합니다.
newObj 를 ? TypedArrayCreateFromConstructor (C ,
« 𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
kValue 를 items [k ]로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
? Set (newObj ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
newObj 를 반환합니다.
23.2.2.3 %TypedArray%.prototype
%TypedArray% .prototype
의 초기 값은 %TypedArray% 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.2.4 get %TypedArray% [ %Symbol.species% ]
%TypedArray% [%Symbol.species%]
는 접근자
프로퍼티(accessor property) 로, set 접근자 함수는
undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
참고
%TypedArray.prototype%
메서드는 일반적으로 this 값의 생성자 를 사용해 파생 객체를 생성합니다.
하지만 서브클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의하여
기본 동작을 오버라이드할 수 있습니다.
23.2.3 %TypedArray% 프로토타입 객체의 속성
%TypedArray% 프로토타입 객체 :
[[Prototype]] 내부 슬롯의 값은 %Object.prototype% 입니다.
%TypedArray.prototype% 입니다.
일반
객체 입니다.
TypedArray 인스턴스 객체에만 특정한 [[ViewedArrayBuffer]] 나 기타 내부
슬롯을 가지지 않습니다.
23.2.3.1 %TypedArray%.prototype.at ( index )
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면,
k 를 relativeIndex 로 설정합니다.
그 밖의 경우,
k 를 len + relativeIndex 로 설정합니다.
k < 0 또는 k ≥ len 이면 undefined 를
반환합니다.
! Get (O , ! ToString (𝔽 (k )))를 반환합니다.
23.2.3.2 get %TypedArray%.prototype.buffer
%TypedArray% .prototype.buffer
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
buffer 를 O .[[ViewedArrayBuffer]] 로
설정합니다.
buffer 를 반환합니다.
23.2.3.3 get %TypedArray%.prototype.byteLength
%TypedArray% .prototype.byteLength
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
size 를 TypedArrayByteLength (taRecord )로
설정합니다.
𝔽 (size )를 반환합니다.
23.2.3.4 get %TypedArray%.prototype.byteOffset
%TypedArray% .prototype.byteOffset
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 +0 𝔽 를 반환합니다.
offset 을 O .[[ByteOffset]] 로 설정합니다.
𝔽 (offset )을 반환합니다.
23.2.3.5 %TypedArray%.prototype.constructor
%TypedArray% .prototype.constructor
의 초기 값은 %TypedArray% 입니다.
23.2.3.6 %TypedArray%.prototype.copyWithin ( target ,
start [ , end ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.4 에 정의된
Array.prototype.copyWithin과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeTarget 를 ? ToIntegerOrInfinity (target )로
설정합니다.
relativeTarget = -∞이면 targetIndex 를 0으로 설정합니다.
그 밖의 경우 relativeTarget < 0이면 targetIndex 를 max (len
+ relativeTarget , 0)으로 설정합니다.
그 밖의 경우 targetIndex 를 min (relativeTarget ,
len )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
len )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (len
+ relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd , len )로
설정합니다.
count 를 min (endIndex -
startIndex , len - targetIndex )로 설정합니다.
count > 0이면,
참고: 복사는 소스 데이터의 비트 레벨 인코딩을 보존하는 방식으로 수행되어야 합니다.
buffer 를 O .[[ViewedArrayBuffer]] 로 설정합니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
byteOffset 을 O .[[ByteOffset]] 로
설정합니다.
bufferByteLimit 을 (len × elementSize )
+ byteOffset 로 설정합니다.
toByteIndex 를 (targetIndex ×
elementSize ) + byteOffset 로 설정합니다.
fromByteIndex 를 (startIndex ×
elementSize ) + byteOffset 로 설정합니다.
countBytes 를 count × elementSize 로 설정합니다.
fromByteIndex < toByteIndex 이고
toByteIndex < fromByteIndex +
countBytes 이면,
direction 을 -1로 설정합니다.
fromByteIndex 를 fromByteIndex +
countBytes - 1로 설정합니다.
toByteIndex 를 toByteIndex +
countBytes - 1로 설정합니다.
그 밖의 경우,
direction 을 1로 설정합니다.
countBytes > 0인 동안 반복합니다,
fromByteIndex < bufferByteLimit 이고
toByteIndex < bufferByteLimit 이면,
value 를 GetValueFromBuffer (buffer ,
fromByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (buffer ,
toByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
fromByteIndex 를 fromByteIndex +
direction 로 설정합니다.
toByteIndex 를 toByteIndex +
direction 로 설정합니다.
countBytes 를 countBytes - 1로 설정합니다.
그 밖의 경우,
countBytes 를 0으로 설정합니다.
O 를 반환합니다.
23.2.3.7 %TypedArray%.prototype.entries ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
key+value )를 반환합니다.
23.2.3.8 %TypedArray%.prototype.every ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.6 에 정의된
Array.prototype.every와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 false 이면 false 를
반환합니다.
k 를 k + 1로 설정합니다.
true 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.9 %TypedArray%.prototype.fill ( value [ ,
start [ , end ] ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.7 에 정의된
Array.prototype.fill과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
O .[[ContentType]] 이
bigint 이면, value 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우, value 를 ? ToNumber (value )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
len )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
len 으로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (len
+ relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd , len )로
설정합니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
len 을 TypedArrayLength (taRecord )로
설정합니다.
endIndex 를 min (endIndex , len )로
설정합니다.
k 를 startIndex 로 설정합니다.
k < endIndex 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
! Set (O ,
Pk , value , true )를 수행합니다.
k 를 k + 1로 설정합니다.
O 를 반환합니다.
23.2.3.10 %TypedArray%.prototype.filter ( callback [
, thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.8 에 정의된
Array.prototype.filter과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
kept 를 새로운 빈 List 로 설정합니다.
captured 를 0으로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
selected 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
selected 가 true 이면,
kValue 를 kept 에 추가합니다.
captured 를 captured + 1로 설정합니다.
k 를 k + 1로 설정합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (captured ) »)로 설정합니다.
n 을 0으로 설정합니다.
kept 의 각 요소 e 에 대해 다음을 수행합니다,
! Set (A ,
! ToString (𝔽 (n )),
e , true )를 수행합니다.
n 을 n + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.11 %TypedArray%.prototype.find ( predicate [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.9 에 정의된
Array.prototype.find와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.12 %TypedArray%.prototype.findIndex (
predicate [ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.10 에 정의된
Array.prototype.findIndex와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , ascending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.13 %TypedArray%.prototype.findLast ( predicate
[ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.11 에 정의된
Array.prototype.findLast와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Value]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.14 %TypedArray%.prototype.findLastIndex (
predicate [ , thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.12 에 정의된
Array.prototype.findLastIndex와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
findRec 를 ? FindViaPredicate (O ,
len , descending , predicate ,
thisArg )로 설정합니다.
findRec .[[Index]] 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.15 %TypedArray%.prototype.forEach ( callback [
, thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.15 에 정의된
Array.prototype.forEach와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)를 수행합니다.
k 를 k + 1로 설정합니다.
undefined 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.16 %TypedArray%.prototype.includes (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.16 에 정의된
Array.prototype.includes와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 false 를 반환합니다.
n 를 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 false 를 반환합니다.
그 밖의 경우 n = -∞이면 n 를 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
elementK 를 ! Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
SameValueZero (searchElement ,
elementK )가 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.17 %TypedArray%.prototype.indexOf (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.17 에 정의된
Array.prototype.indexOf와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
n 를 ? ToIntegerOrInfinity (fromIndex )로
설정합니다.
Assert :
fromIndex 가 undefined 이면 n 은 0입니다.
n = +∞이면 -1 𝔽 를 반환합니다.
그 밖의 경우 n = -∞이면 n 를 0으로 설정합니다.
n ≥ 0이면,
k 를 n 으로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k < 0이면 k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ! HasProperty (O ,
Pk )로 설정합니다.
kPresent 가 true 이면,
elementK 를 ! Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )가 true 이면 𝔽 (k )를
반환합니다.
k 를 k + 1로 설정합니다.
-1 𝔽 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.18 %TypedArray%.prototype.join ( separator )
이 메서드의 인수 해석 및 사용법은 23.1.3.18 에 정의된
Array.prototype.join과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
separator 가 undefined 이면 sep 를
"," 로 설정합니다.
그 밖의 경우, sep 를 ? ToString (separator )로 설정합니다.
R 을 빈 문자열로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
k > 0이면 R 을 R 과 sep 를 문자열 연결 한 값으로 설정합니다.
element 를 ! Get (O ,
! ToString (𝔽 (k )))로 설정합니다.
element 가 undefined 가 아니면,
S 를 ! ToString (element )로
설정합니다.
R 을 R 과 S 를 문자열 연결 한 값으로
설정합니다.
k 를 k + 1로 설정합니다.
R 을 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.19 %TypedArray%.prototype.keys ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
key )를 반환합니다.
23.2.3.20 %TypedArray%.prototype.lastIndexOf (
searchElement [ , fromIndex ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.20 에 정의된
Array.prototype.lastIndexOf와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
len = 0이면 -1 𝔽 를 반환합니다.
fromIndex 가 제공되면 n 를 ? ToIntegerOrInfinity (fromIndex )로
설정하고, 아니라면 n 을 len - 1로 설정합니다.
n = -∞이면 -1 𝔽 를 반환합니다.
n ≥ 0이면,
k 를 min (n , len -
1)로 설정합니다.
그 밖의 경우,
k 를 len + n 으로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kPresent 를 ! HasProperty (O ,
Pk )로 설정합니다.
kPresent 가 true 이면,
elementK 를 ! Get (O ,
Pk )로 설정합니다.
IsStrictlyEqual (searchElement ,
elementK )가 true 이면 𝔽 (k )를
반환합니다.
k 를 k - 1로 설정합니다.
-1 𝔽 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.21 get %TypedArray%.prototype.length
%TypedArray% .prototype.length
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 와 [[ArrayLength]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 +0 𝔽 를 반환합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
𝔽 (length )를 반환합니다.
이 함수는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.22 %TypedArray%.prototype.map ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.21 에 정의된
Array.prototype.map과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
mappedValue 를 ? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »)로 설정합니다.
? Set (A , Pk ,
mappedValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.23 %TypedArray%.prototype.reduce ( callback [
, initialValue ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.24 에 정의된
Array.prototype.reduce와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 0으로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
accumulator 를 ! Get (O , Pk )로
설정합니다.
k 를 k + 1로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator , kValue ,
𝔽 (k ), O »)로
설정합니다.
k 를 k + 1로 설정합니다.
accumulator 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.24 %TypedArray%.prototype.reduceRight (
callback [ , initialValue ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.25 에 정의된
Array.prototype.reduceRight와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
len = 0이고 initialValue 가 제공되지 않으면 TypeError
예외를 throw합니다.
k 를 len - 1로 설정합니다.
accumulator 를 undefined 로 설정합니다.
initialValue 가 제공되면,
accumulator 를 initialValue 로 설정합니다.
그 밖의 경우,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
accumulator 를 ! Get (O , Pk )로
설정합니다.
k 를 k - 1로 설정합니다.
k ≥ 0인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
accumulator 를 ? Call (callback ,
undefined , « accumulator , kValue ,
𝔽 (k ), O »)로
설정합니다.
k 를 k - 1로 설정합니다.
accumulator 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.25 %TypedArray%.prototype.reverse ( )
이 메서드의 인수 해석 및 사용법은 23.1.3.26 에 정의된
Array.prototype.reverse와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
middle 를 floor (len / 2)로 설정합니다.
lower 를 0으로 설정합니다.
lower ≠ middle 인 동안 반복합니다,
upper 를 len - lower - 1로 설정합니다.
upperP 를 ! ToString (𝔽 (upper ))로
설정합니다.
lowerP 를 ! ToString (𝔽 (lower ))로
설정합니다.
lowerValue 를 ! Get (O ,
lowerP )로 설정합니다.
upperValue 를 ! Get (O ,
upperP )로 설정합니다.
! Set (O ,
lowerP , upperValue , true )를 수행합니다.
! Set (O ,
upperP , lowerValue , true )를 수행합니다.
lower 를 lower + 1로 설정합니다.
O 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.26 %TypedArray%.prototype.set ( source [ ,
offset ] )
이 메서드는 이 TypedArray 의 여러 값을 source 에서 값을 읽어 설정합니다. 상세 동작은
source 의 타입에 따라 다릅니다. 선택적 offset 값은 이 TypedArray 에 값을 쓸 첫 번째
요소 인덱스를 의미합니다. 생략된 경우 0으로 간주됩니다.
호출 시 다음 단계들을 수행합니다:
target 를 this 값으로 설정합니다.
? RequireInternalSlot (target ,
[[TypedArrayName]] )를 수행합니다.
Assert :
target 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
targetOffset 를 ? ToIntegerOrInfinity (offset )로
설정합니다.
targetOffset < 0이면 RangeError 예외를 throw합니다.
source 가 객체 이고 [[TypedArrayName]] 내부 슬롯을 가지면,
? SetTypedArrayFromTypedArray (target ,
targetOffset , source )를 수행합니다.
그 밖의 경우,
? SetTypedArrayFromArrayLike (target ,
targetOffset , source )를 수행합니다.
undefined 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.26.1 SetTypedArrayFromArrayLike ( target ,
targetOffset , source )
추상 연산 SetTypedArrayFromArrayLike는 인수 target (a
TypedArray ), targetOffset (0 이상의
정수 또는 +∞),
source (ECMAScript 언어 값 , 단
TypedArray 는 아님)를 받고 내용이
unused 인 일반 완료(normal completion) 또는 throw 완료 를 반환합니다.
target 의 targetOffset 인덱스부터 source 에서 값을 읽어 여러 값을 설정합니다.
호출 시 다음 단계들을 수행합니다:
targetRecord 를 MakeTypedArrayWithBufferWitnessRecord (target ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (targetRecord )
가 true 이면 TypeError 예외를 throw합니다.
targetLength 를 TypedArrayLength (targetRecord )로
설정합니다.
src 를 ? ToObject (source )로 설정합니다.
srcLength 를 ? LengthOfArrayLike (src )로
설정합니다.
targetOffset = +∞이면 RangeError 예외를 throw합니다.
srcLength + targetOffset > targetLength 이면,
RangeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < srcLength 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
value 를 ? Get (src ,
Pk )로 설정합니다.
targetIndex 를 𝔽 (targetOffset +
k )로 설정합니다.
? TypedArraySetElement (target ,
targetIndex , value )를 수행합니다.
k 를 k + 1로 설정합니다.
unused 를 반환합니다.
23.2.3.26.2 SetTypedArrayFromTypedArray ( target ,
targetOffset , source )
추상 연산 SetTypedArrayFromTypedArray는 인수 target (TypedArray ),
targetOffset (0 이상의 정수 또는 +∞), source (TypedArray )를
받고 내용이
unused 인 일반 완료(normal completion) 또는 throw 완료 를 반환합니다.
target 의 targetOffset 인덱스부터 source 에서 값을 읽어 여러 값을 설정합니다.
호출 시 다음 단계들을 수행합니다:
targetBuffer 를 target .[[ViewedArrayBuffer]] 로 설정합니다.
targetRecord 를 MakeTypedArrayWithBufferWitnessRecord (target ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (targetRecord )
가 true 이면 TypeError 예외를 throw합니다.
targetLength 를 TypedArrayLength (targetRecord )로
설정합니다.
srcBuffer 를 source .[[ViewedArrayBuffer]] 로 설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (source ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면 TypeError 예외를 throw합니다.
srcLength 를 TypedArrayLength (srcRecord )로
설정합니다.
targetType 를 TypedArrayElementType (target )로
설정합니다.
targetElementSize 를 TypedArrayElementSize (target )로
설정합니다.
targetByteOffset 을 target .[[ByteOffset]] 로 설정합니다.
srcType 을 TypedArrayElementType (source )로
설정합니다.
srcElementSize 를 TypedArrayElementSize (source )로
설정합니다.
srcByteOffset 을 source .[[ByteOffset]] 로 설정합니다.
targetOffset = +∞이면 RangeError 예외를 throw합니다.
srcLength + targetOffset > targetLength 이면,
RangeError 예외를 throw합니다.
target .[[ContentType]] 이
source .[[ContentType]] 과 다르면
TypeError 예외를 throw합니다.
IsSharedArrayBuffer (srcBuffer )
가 true , IsSharedArrayBuffer (targetBuffer )
가 true 이고 srcBuffer .[[ArrayBufferData]] 가 targetBuffer .[[ArrayBufferData]] 와 같으면
sameSharedArrayBuffer 를 true 로, 그렇지 않으면
sameSharedArrayBuffer 를 false 로 설정합니다.
SameValue (srcBuffer ,
targetBuffer )가 true 이거나
sameSharedArrayBuffer 가 true 이면,
srcByteLength 를 TypedArrayByteLength (srcRecord )로
설정합니다.
srcBuffer 를 ? CloneArrayBuffer (srcBuffer ,
srcByteOffset , srcByteLength )로 설정합니다.
srcByteIndex 를 0으로 설정합니다.
그 밖의 경우,
srcByteIndex 를 srcByteOffset 으로 설정합니다.
targetByteIndex 를 (targetOffset ×
targetElementSize ) + targetByteOffset 로 설정합니다.
limit 을 targetByteIndex +
(targetElementSize × srcLength )로 설정합니다.
srcType 이 targetType 이면,
참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
targetByteIndex < limit 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex + 1로 설정합니다.
targetByteIndex 를 targetByteIndex +
1로 설정합니다.
그 밖의 경우,
targetByteIndex < limit 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , srcType ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , targetType ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex +
srcElementSize 로 설정합니다.
targetByteIndex 를 targetByteIndex +
targetElementSize 로 설정합니다.
unused 를 반환합니다.
23.2.3.27 %TypedArray%.prototype.slice ( start ,
end )
이 메서드의 인수 해석 및 사용법은 23.1.3.28 에 정의된
Array.prototype.slice와 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
srcArrayLength 를 TypedArrayLength (taRecord )로
설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (srcArrayLength +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
srcArrayLength )로 설정합니다.
end 가 undefined 이면 relativeEnd 를
srcArrayLength 로 설정하고, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (srcArrayLength
+
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd ,
srcArrayLength )로 설정합니다.
countBytes 를 max (endIndex -
startIndex , 0)로 설정합니다.
A 를 ? TypedArraySpeciesCreate (O , «
𝔽 (countBytes ) »)로 설정합니다.
countBytes > 0이면,
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
endIndex 를 min (endIndex , TypedArrayLength (taRecord ))로
설정합니다.
countBytes 를 max (endIndex -
startIndex , 0)로 설정합니다.
srcType 을 TypedArrayElementType (O )로
설정합니다.
targetType 을 TypedArrayElementType (A )로
설정합니다.
srcType 이 targetType 이면,
참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
srcBuffer 를 O .[[ViewedArrayBuffer]] 로 설정합니다.
targetBuffer 를 A .[[ViewedArrayBuffer]] 로 설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcByteOffset 을 O .[[ByteOffset]] 로 설정합니다.
srcByteIndex 를 (startIndex ×
elementSize ) + srcByteOffset 로 설정합니다.
targetByteIndex 를 A .[[ByteOffset]] 로 설정합니다.
endByteIndex 를 targetByteIndex +
(countBytes × elementSize )로 설정합니다.
targetByteIndex <
endByteIndex 인 동안 반복합니다,
value 를 GetValueFromBuffer (srcBuffer ,
srcByteIndex , uint8 ,
true , unordered )로
설정합니다.
SetValueInBuffer (targetBuffer ,
targetByteIndex , uint8 ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex + 1로 설정합니다.
targetByteIndex 를 targetByteIndex
+ 1로 설정합니다.
그 밖의 경우,
n 을 0으로 설정합니다.
k 를 startIndex 로 설정합니다.
k < endIndex 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O ,
Pk )로 설정합니다.
! Set (A ,
! ToString (𝔽 (n )),
kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
n 을 n + 1로 설정합니다.
A 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.28 %TypedArray%.prototype.some ( callback [ ,
thisArg ] )
이 메서드의 인수 해석 및 사용법은 23.1.3.29 에 정의된
Array.prototype.some과 동일합니다.
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
kValue 를 ! Get (O , Pk )로
설정합니다.
testResult 를 ToBoolean (? Call (callback ,
thisArg , « kValue , 𝔽 (k ),
O »))로 설정합니다.
testResult 가 true 이면 true 를
반환합니다.
k 를 k + 1로 설정합니다.
false 를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.29 %TypedArray%.prototype.sort ( comparator )
이것은 별도의 메서드로, 아래에 설명한 부분을 제외하면 23.1.3.30 에 정의된
Array.prototype.sort의 요구 사항을 구현합니다. 이 메서드의 구현은 this 값이 고정
길이이며 정수
인덱스(integer-indexed) 프로퍼티가 희소하지 않다는 사실을 활용해 최적화할 수 있습니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가 아니고 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
obj 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (obj ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
참고: 다음 클로저는 23.1.3.30 에서 사용되는 문자열 비교 대신
숫자 비교를 수행합니다.
SortCompare 를 매개변수 (x , y )와 comparator 를
캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure) 로 설정합니다:
? CompareTypedArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (obj ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! Set (obj ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
obj 를 반환합니다.
참고
NaN 은 항상 다른 어떤 값보다 더 크게 비교되므로 (자세한 내용은 CompareTypedArrayElements
참조), comparator 가 제공되지 않은 경우 NaN 프로퍼티 값은 항상 결과의 끝에
정렬됩니다.
23.2.3.30 %TypedArray%.prototype.subarray ( start ,
end )
이 메서드는 새로운 TypedArray 를 반환합니다. 반환되는 TypedArray 의 요소 타입은 이
TypedArray 의 요소 타입과 같고, ArrayBuffer는 이 TypedArray 의 ArrayBuffer입니다. 반환되는
객체는 start (포함)부터 end (제외)까지의 interval 에 해당하는 요소를 참조합니다.
start 또는 end 가 음수인 경우, 배열의 끝에서부터 인덱스를 참조합니다.
호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
buffer 를 O .[[ViewedArrayBuffer]] 로
설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면,
srcLength 를 0으로 설정합니다.
그 밖의 경우,
srcLength 를 TypedArrayLength (srcRecord )로
설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 startIndex 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 startIndex 를 max (srcLength +
relativeStart , 0)으로 설정합니다.
그 밖의 경우 startIndex 를 min (relativeStart ,
srcLength )로 설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcByteOffset 을 O .[[ByteOffset]] 로
설정합니다.
beginByteOffset 을 srcByteOffset + (startIndex
× elementSize )로 설정합니다.
O .[[ArrayLength]] 가 auto 이고
end 가 undefined 이면,
argumentsList 를 « buffer , 𝔽 (beginByteOffset ) »로
설정합니다.
그 밖의 경우,
end 가 undefined 이면 relativeEnd 를
srcLength 로 설정하고, 아니라면 relativeEnd 를 ? ToIntegerOrInfinity (end )로
설정합니다.
relativeEnd = -∞이면 endIndex 를 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 endIndex 를 max (srcLength +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 endIndex 를 min (relativeEnd ,
srcLength )로 설정합니다.
newLength 를 max (endIndex -
startIndex , 0)로 설정합니다.
argumentsList 를 « buffer , 𝔽 (beginByteOffset ), 𝔽 (newLength ) »로 설정합니다.
? TypedArraySpeciesCreate (O ,
argumentsList )를 반환합니다.
이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부
슬롯을 가진 객체여야 합니다.
23.2.3.31 %TypedArray%.prototype.toLocaleString ( [
reserved1 [ , reserved2 ] ] )
이 메서드는 23.1.3.32 에 정의된
Array.prototype.toLocaleString과 동일한 알고리즘을 구현하는 별도의 메서드입니다. 단, TypedArrayLength 를 사용하여
"length" 의 [[Get]] 을 대신합니다. 알고리즘 구현은 버퍼가 리사이즈 불가능할
때 this 값의 길이가 고정되어 있다는 점과 integer-indexed 프로퍼티가 희소하지 않다는
점을 활용해 최적화할 수 있습니다. 단, 이러한 최적화는 알고리즘의 명세된 행동에 관찰 가능한 변화를 주면 안 됩니다.
이 메서드는 일반적이지 않습니다. ValidateTypedArray 가
this 값과 seq-cst 인수로 호출되어 알고리즘 평가 전 예외가 발생하면, 알고리즘
평가 대신 해당 예외가 throw됩니다.
참고
ECMAScript 구현에 ECMA-402 국제화 API가 포함되어 있다면, 이 메서드는 ECMA-402 명세의
Array.prototype.toLocaleString 알고리즘을 기반으로 합니다.
23.2.3.32 %TypedArray%.prototype.toReversed ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (length ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < length 인 동안 반복합니다,
from 을 ! ToString (𝔽 (length -
k - 1))로 설정합니다.
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
fromValue 를 ! Get (O ,
from )로 설정합니다.
! Set (A ,
Pk , fromValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.2.3.33 %TypedArray%.prototype.toSorted (
comparator )
이 메서드는 호출 시 다음 단계들을 수행합니다:
comparator 가 undefined 가 아니고 IsCallable (comparator )가
false 이면 TypeError 예외를 throw합니다.
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (len ) »)로 설정합니다.
참고: 다음 클로저는 23.1.3.34 에서 사용되는 문자열 비교
대신 숫자 비교를 수행합니다.
SortCompare 를 매개변수 (x , y )와 comparator 를
캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure) 로 설정합니다:
? CompareTypedArrayElements (x ,
y , comparator )를 반환합니다.
sortedList 를 ? SortIndexedProperties (O ,
len , SortCompare , read-through-holes )로
설정합니다.
j 를 0으로 설정합니다.
j < len 인 동안 반복합니다,
! Set (A ,
! ToString (𝔽 (j )),
sortedList [j ], true )를 수행합니다.
j 를 j + 1로 설정합니다.
A 를 반환합니다.
23.2.3.34 %TypedArray%.prototype.toString ( )
"toString" 프로퍼티의 초기 값은 23.1.3.36 에 정의된
%Array.prototype.toString%입니다.
23.2.3.35 %TypedArray%.prototype.values ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ValidateTypedArray (O ,
seq-cst )를 수행합니다.
CreateArrayIterator (O ,
value )를 반환합니다.
23.2.3.36 %TypedArray%.prototype.with ( index ,
value )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
taRecord 를 ? ValidateTypedArray (O ,
seq-cst )로 설정합니다.
len 를 TypedArrayLength (taRecord )로
설정합니다.
relativeIndex 를 ? ToIntegerOrInfinity (index )로
설정합니다.
relativeIndex ≥ 0이면 actualIndex 를 relativeIndex 로
설정합니다.
그 밖의 경우 actualIndex 를 len + relativeIndex 로 설정합니다.
O .[[ContentType]] 이
bigint 이면 numericValue 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우 numericValue 를 ? ToNumber (value )로 설정합니다.
IsValidIntegerIndex (O ,
𝔽 (actualIndex ))가
false 이면 RangeError 예외를 throw합니다.
A 를 ? TypedArrayCreateSameType (O , «
𝔽 (len ) »)로 설정합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로 설정합니다.
k = actualIndex 이면 fromValue 를
numericValue 로 설정합니다.
그 밖의 경우 fromValue 를 ! Get (O ,
Pk )로 설정합니다.
! Set (A ,
Pk , fromValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
A 를 반환합니다.
23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
23.2.3.35 에 정의된
%TypedArray.prototype.values%입니다.
23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]
%TypedArray% .prototype[%Symbol.toStringTag%]
는 접근자
프로퍼티 이며, set 접근자 함수는 undefined 입니다.
get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
O 가 객체가 아니면 undefined 를
반환합니다.
O 에 [[TypedArrayName]] 내부 슬롯이 없으면
undefined 를 반환합니다.
name 을 O .[[TypedArrayName]] 로 설정합니다.
Assert :
name 은 문자열 입니다.
name 을 반환합니다.
이 프로퍼티의 속성은 { [[Enumerable]] :
false , [[Configurable]] : true
}입니다.
이 함수의 "name" 프로퍼티의 초기 값은 "get
[Symbol.toStringTag]" 입니다.
23.2.4 TypedArray 객체에 대한 추상 연산
23.2.4.1 TypedArrayCreateFromConstructor (
constructor , argumentList )
추상 연산 TypedArrayCreateFromConstructor는 인수 constructor (생성자 )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
생성자 함수를
사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다. 호출 시 다음 단계들을 수행합니다:
newTypedArray 를 ? Construct (constructor ,
argumentList )로 설정합니다.
taRecord 를 ? ValidateTypedArray (newTypedArray ,
seq-cst )로 설정합니다.
Assert :
newTypedArray 는 TypedArray 인스턴스의
프로퍼티 에 명시된 모든 내부 슬롯을 갖습니다.
argumentList 의 요소 개수가 1이고 argumentList [0]이 Number 이면,
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
length 를 TypedArrayLength (taRecord )로
설정합니다.
length < ℝ (argumentList [0])이면
TypeError 예외를 throw합니다.
newTypedArray 를 반환합니다.
23.2.4.2 TypedArrayCreateSameType ( exemplar ,
argumentList )
추상 연산 TypedArrayCreateSameType은 인수 exemplar (TypedArray )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
exemplar 에서 파생된 생성자 함수를 사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다.
TypedArraySpeciesCreate 와 달리,
%Symbol.species% 를 통해 커스텀 TypedArray
서브클래스를 생성할 수 있는 것과 다르게, 이 연산은 항상 내장 TypedArray 생성자 중 하나를 사용합니다. 호출 시 다음 단계들을
수행합니다:
constructor 를 생성자 이름 exemplar .[[TypedArrayName]] 에 연관된 내재 객체로 표 75 에서 찾습니다.
result 를 ? TypedArrayCreateFromConstructor (constructor ,
argumentList )로 설정합니다.
Assert :
result .[[ContentType]] 은 exemplar .[[ContentType]] 와 같습니다.
result 를 반환합니다.
23.2.4.3 TypedArraySpeciesCreate ( exemplar ,
argumentList )
추상 연산 TypedArraySpeciesCreate는 인수 exemplar (TypedArray )와
argumentList (리스트 형태의
ECMAScript 언어 값 )를 받고, 정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다. 이는
exemplar 에서 파생된 생성자 함수를 사용해 새로운 TypedArray 를 생성하는 명세에 사용됩니다.
ArraySpeciesCreate 와 달리, %Symbol.species% 를 통해 Array가 아닌 객체를 생성할
수 있지만, 이 연산은 생성자 함수가 실제 TypedArray 를 생성하도록 강제합니다. 호출 시 다음
단계들을 수행합니다:
defaultConstructor 를 생성자 이름 exemplar .[[TypedArrayName]] 에 연관된 내재 객체로 표 75 에서 찾습니다.
constructor 를 ? SpeciesConstructor (exemplar ,
defaultConstructor )로 설정합니다.
result 를 ? TypedArrayCreateFromConstructor (constructor ,
argumentList )로 설정합니다.
result .[[ContentType]] 이 exemplar .[[ContentType]] 와 다르면 TypeError 예외를
throw합니다.
result 를 반환합니다.
23.2.4.4 ValidateTypedArray ( O , order )
추상 연산 ValidateTypedArray는 인수 O (ECMAScript 언어
값 )와 order (seq-cst 또는
unordered )를 받고, 정상 완료(normal
completion) 로 TypedArray With Buffer Witness
Record 또는 throw
완료 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (O ,
[[TypedArrayName]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (O ,
order )로 설정합니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
taRecord 를 반환합니다.
23.2.4.5 TypedArrayElementSize ( O )
추상 연산 TypedArrayElementSize는 인수 O (TypedArray )를 받고, 0 이상의 정수 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
O .[[TypedArrayName]] 에 대해 표 75 에 지정된 요소
크기(Element Size) 값을 반환합니다.
23.2.4.6 TypedArrayElementType ( O )
추상 연산 TypedArrayElementType은 인수 O (TypedArray )를 받고, TypedArray 요소 타입 를 반환합니다. 호출 시 다음 단계들을
수행합니다:
O .[[TypedArrayName]] 에 대해 표 75 에 지정된 요소
타입(Element Type) 값을 반환합니다.
23.2.4.7 CompareTypedArrayElements ( x , y ,
comparator )
추상 연산 CompareTypedArrayElements는 인수 x (Number 또는 BigInt), y (Number 또는
BigInt), comparator (함수 객체 또는 undefined )를 받고,
정상 완료(normal
completion) 로 Number 또는 abrupt completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
x 가 Number 이고
y 가 Number 이거나,
x 가 BigInt 이고
y 가 BigInt 입니다.
comparator 가 undefined 가 아니면,
v 를 ? ToNumber (?
Call (comparator ,
undefined , « x , y »))로 설정합니다.
v 가 NaN 이면 +0 𝔽 를
반환합니다.
v 를 반환합니다.
x 와 y 가 모두 NaN 이면
+0 𝔽 를 반환합니다.
x 가 NaN 이면 1 𝔽 를 반환합니다.
y 가 NaN 이면 -1 𝔽 를 반환합니다.
x < y 이면 -1 𝔽 를 반환합니다.
x > y 이면 1 𝔽 를 반환합니다.
x 가 -0 𝔽 이고 y 가
+0 𝔽 이면 -1 𝔽 를 반환합니다.
x 가 +0 𝔽 이고 y 가
-0 𝔽 이면 1 𝔽 를 반환합니다.
+0 𝔽 를 반환합니다.
참고
이 연산은
23.1.3.30.2 에서 사용되는 문자열 비교 대신 숫자
비교를 수행합니다.
23.2.5 TypedArray 생성자
각 TypedArray 생성자 :
내재 객체이며, 아래에 설명된 구조를 가지나 표 75 에서
생성자 이름
대신 TypedArray 이름만 다릅니다.
인수의 개수와 타입에 따라 동작이 달라지는 함수입니다. TypedArray 를 호출할 때 실제 동작은 전달되는 인수의 개수와 종류에 따라
달라집니다.
함수로 호출되는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용될 수 있습니다. 지정된 TypedArray 동작을 상속하려는 서브클래스
생성자 는
TypedArray 생성자 에 super 호출을 포함하여 서브클래스 인스턴스가
%TypedArray% .prototype
내장 메서드를 지원하는 데 필요한 내부 상태를 생성 및 초기화해야 합니다.
23.2.5.1 TypedArray ( ...args )
각 TypedArray 생성자 는 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
constructorName 을 표 75 에서
이 TypedArray 생성자 에 대해 명시된 생성자 이름의 문자열 값으로 설정합니다.
proto 를 "%TypedArray .prototype%"로 설정합니다.
numberOfArgs 를 args 의 요소 개수로 설정합니다.
numberOfArgs = 0이면,
? AllocateTypedArray (constructorName ,
NewTarget, proto , 0)를 반환합니다.
그 밖의 경우,
firstArgument 를 args [0]으로 설정합니다.
firstArgument 가 객체 이면,
O 를 ? AllocateTypedArray (constructorName ,
NewTarget, proto )로 설정합니다.
firstArgument 가 [[TypedArrayName]] 내부 슬롯을 가지면,
? InitializeTypedArrayFromTypedArray (O ,
firstArgument )를 수행합니다.
그 밖의 경우 firstArgument 가 [[ArrayBufferData]] 내부 슬롯을 가지면,
numberOfArgs > 1이면 byteOffset 를
args [1]으로, 아니면 byteOffset 를
undefined 로 설정합니다.
numberOfArgs > 2이면 length 를
args [2]으로, 아니면 length 를
undefined 로 설정합니다.
? InitializeTypedArrayFromArrayBuffer (O ,
firstArgument , byteOffset ,
length )를 수행합니다.
그 밖의 경우,
Assert :
firstArgument 는 객체 이며 [[TypedArrayName]] 또는 [[ArrayBufferData]] 내부 슬롯을 갖지 않습니다.
usingIterator 를 ? GetMethod (firstArgument ,
%Symbol.iterator% )로
설정합니다.
usingIterator 가 undefined 가 아니면,
values 를 ? IteratorToList (?
GetIteratorFromMethod (firstArgument ,
usingIterator ))로 설정합니다.
? InitializeTypedArrayFromList (O ,
values )를 수행합니다.
그 밖의 경우,
참고: firstArgument 는 이터러블
객체 가 아니므로, 이미 array-like
객체 라고 간주합니다.
? InitializeTypedArrayFromArrayLike (O ,
firstArgument )를 수행합니다.
O 를 반환합니다.
그 밖의 경우,
Assert :
firstArgument 는 객체가
아님 입니다.
elementLength 를 ? ToIndex (firstArgument )로
설정합니다.
? AllocateTypedArray (constructorName ,
NewTarget, proto , elementLength )를 반환합니다.
23.2.5.1.1 AllocateTypedArray ( constructorName ,
newTarget , defaultProto [ , length ] )
추상 연산 AllocateTypedArray는 인수 constructorName (TypedArray 생성자 이름의
문자열, 표 75 참조),
newTarget (생성자 ), defaultProto (문자열) 및 선택적
length (0 이상의 정수 )를 받고,
정상 완료(normal
completion) 로 TypedArray 또는 throw 완료 를 반환합니다.
length 인수가 전달되면 해당 길이의 ArrayBuffer도 할당되고 새 TypedArray 인스턴스에 연결됩니다.
AllocateTypedArray는 TypedArray 의 공통적인 의미를 제공합니다. 호출 시 다음 단계들을 수행합니다:
proto 를 ? GetPrototypeFromConstructor (newTarget ,
defaultProto )로 설정합니다.
obj 를 TypedArrayCreate (proto )로
설정합니다.
Assert : obj .[[ViewedArrayBuffer]] 는 undefined 입니다.
obj .[[TypedArrayName]] 을
constructorName 으로 설정합니다.
constructorName 이 "BigInt64Array" 또는
"BigUint64Array" 이면, obj .[[ContentType]] 을 bigint 로 설정합니다.
그 밖의 경우, obj .[[ContentType]] 을
number 로 설정합니다.
length 가 없으면,
obj .[[ByteLength]] 를 0으로 설정합니다.
obj .[[ByteOffset]] 를 0으로 설정합니다.
obj .[[ArrayLength]] 를 0으로 설정합니다.
그 밖의 경우,
? AllocateTypedArrayBuffer (obj ,
length )를 수행합니다.
obj 를 반환합니다.
23.2.5.1.2 InitializeTypedArrayFromTypedArray (
O , srcArray )
추상 연산 InitializeTypedArrayFromTypedArray는 인수 O (TypedArray ),
srcArray (TypedArray )를 받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
srcData 를 srcArray .[[ViewedArrayBuffer]] 로 설정합니다.
elementType 을 TypedArrayElementType (O )로
설정합니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
srcType 을 TypedArrayElementType (srcArray )로
설정합니다.
srcElementSize 를 TypedArrayElementSize (srcArray )로
설정합니다.
srcByteOffset 을 srcArray .[[ByteOffset]] 로 설정합니다.
srcRecord 를 MakeTypedArrayWithBufferWitnessRecord (srcArray ,
seq-cst )로 설정합니다.
IsTypedArrayOutOfBounds (srcRecord )
가 true 이면 TypeError 예외를 throw합니다.
elementLength 를 TypedArrayLength (srcRecord )로
설정합니다.
byteLength 를 elementSize × elementLength 로 설정합니다.
elementType 이 srcType 이면,
data 를 ? CloneArrayBuffer (srcData ,
srcByteOffset , byteLength )로 설정합니다.
그 밖의 경우,
data 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
byteLength )로 설정합니다.
srcArray .[[ContentType]] 이
O .[[ContentType]] 과 다르면
TypeError 예외를 throw합니다.
srcByteIndex 를 srcByteOffset 으로 설정합니다.
targetByteIndex 를 0으로 설정합니다.
count 를 elementLength 로 설정합니다.
count > 0인 동안 반복합니다,
value 를 GetValueFromBuffer (srcData ,
srcByteIndex , srcType ,
true , unordered )로
설정합니다.
SetValueInBuffer (data ,
targetByteIndex , elementType ,
value , true ,
unordered )를 수행합니다.
srcByteIndex 를 srcByteIndex +
srcElementSize 로 설정합니다.
targetByteIndex 를 targetByteIndex +
elementSize 로 설정합니다.
count 를 count - 1로 설정합니다.
O .[[ViewedArrayBuffer]] 를
data 로 설정합니다.
O .[[ByteLength]] 를
byteLength 로 설정합니다.
O .[[ByteOffset]] 를 0으로 설정합니다.
O .[[ArrayLength]] 를
elementLength 로 설정합니다.
unused 를 반환합니다.
23.2.5.1.3 InitializeTypedArrayFromArrayBuffer (
O , buffer , byteOffset , length )
추상 연산 InitializeTypedArrayFromArrayBuffer는 인수 O (TypedArray ), buffer
(ArrayBuffer 또는 SharedArrayBuffer), byteOffset (ECMAScript 언어 값 ),
length (ECMAScript 언어 값 )를 받고,
정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
offset 을 ? ToIndex (byteOffset )로
설정합니다.
offset modulo elementSize ≠ 0이면
RangeError 예외를 throw합니다.
bufferIsFixedLength 를 IsFixedLengthArrayBuffer (buffer )로
설정합니다.
length 가 undefined 가 아니면,
newLength 를 ? ToIndex (length )로
설정합니다.
IsDetachedBuffer (buffer )
가 true 이면 TypeError 예외를 throw합니다.
bufferByteLength 를 ArrayBufferByteLength (buffer ,
seq-cst )로 설정합니다.
length 가 undefined 이고
bufferIsFixedLength 가 false 이면,
offset > bufferByteLength 이면
RangeError 예외를 throw합니다.
O .[[ByteLength]] 를
auto 로 설정합니다.
O .[[ArrayLength]] 를
auto 로 설정합니다.
그 밖의 경우,
length 가 undefined 이면,
bufferByteLength modulo
elementSize ≠ 0이면 RangeError 예외를
throw합니다.
newByteLength 를 bufferByteLength -
offset 으로 설정합니다.
newByteLength < 0이면 RangeError
예외를 throw합니다.
그 밖의 경우,
newByteLength 를 newLength ×
elementSize 로 설정합니다.
offset + newByteLength >
bufferByteLength 이면 RangeError 예외를
throw합니다.
O .[[ByteLength]] 를
newByteLength 로 설정합니다.
O .[[ArrayLength]] 를
newByteLength / elementSize 로 설정합니다.
O .[[ViewedArrayBuffer]] 를
buffer 로 설정합니다.
O .[[ByteOffset]] 를 offset 으로 설정합니다.
unused 를 반환합니다.
23.2.5.1.4 InitializeTypedArrayFromList ( O ,
values )
추상 연산 InitializeTypedArrayFromList는 인수 O (TypedArray ), values
(리스트 형태의 ECMAScript 언어 값 )를 받고,
정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
len 을 values 의 요소 개수로 설정합니다.
? AllocateTypedArrayBuffer (O ,
len )를 수행합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
kValue 를 values 의 첫 번째 요소로 설정합니다.
values 의 첫 번째 요소를 제거합니다.
? Set (O ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
Assert : values 는 이제 빈 리스트 입니다.
unused 를 반환합니다.
23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O ,
arrayLike )
추상 연산 InitializeTypedArrayFromArrayLike는 인수 O (TypedArray ),
arrayLike (객체, 단 TypedArray 또는 ArrayBuffer는 아님)를 받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
호출 시 다음 단계들을 수행합니다:
len 을 ? LengthOfArrayLike (arrayLike )로
설정합니다.
? AllocateTypedArrayBuffer (O ,
len )를 수행합니다.
k 를 0으로 설정합니다.
k < len 인 동안 반복합니다,
Pk 를 ! ToString (𝔽 (k ))로
설정합니다.
kValue 를 ? Get (arrayLike ,
Pk )로 설정합니다.
? Set (O ,
Pk , kValue , true )를 수행합니다.
k 를 k + 1로 설정합니다.
unused 를 반환합니다.
23.2.5.1.6 AllocateTypedArrayBuffer ( O ,
length )
추상 연산 AllocateTypedArrayBuffer는 인수 O (TypedArray ), length
(0 이상의 정수 )를
받고, 정상 완료(normal
completion) 로 unused 또는 throw 완료 를 반환합니다.
O 에 ArrayBuffer를 할당하고 연결합니다. 호출 시 다음 단계들을 수행합니다:
Assert : O .[[ViewedArrayBuffer]] 는 undefined 입니다.
elementSize 를 TypedArrayElementSize (O )로
설정합니다.
byteLength 를 elementSize × length 로 설정합니다.
data 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
byteLength )로 설정합니다.
O .[[ViewedArrayBuffer]] 를
data 로 설정합니다.
O .[[ByteLength]] 를
byteLength 로 설정합니다.
O .[[ByteOffset]] 를 0으로 설정합니다.
O .[[ArrayLength]] 를 length 로 설정합니다.
unused 를 반환합니다.
23.2.6 TypedArray 생성자의 속성
각 TypedArray 생성자 :
[[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray% 입니다.
"length" 프로퍼티를 가지며 그 값은 3 𝔽 입니다.
"name" 프로퍼티를 가지며 그 값은 표 75 에서 명시된
생성자 이름의
문자열 값입니다.
다음 프로퍼티들을 가집니다:
23.2.6.1 TypedArray .BYTES_PER_ELEMENT
TypedArray .BYTES_PER_ELEMENT의 값은 표 75 에서
TypedArray 에 대해 명시된 요소 크기(Element Size) 값입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.6.2 TypedArray .prototype
TypedArray .prototype의 초기 값은 해당 TypedArray 프로토타입 내재
객체(23.2.7 )입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.7 TypedArray 프로토타입 객체의 속성
각 TypedArray 프로토타입 객체:
[[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray.prototype% 입니다.
일반
객체 입니다.
[[ViewedArrayBuffer]] 또는 TypedArray 인스턴스 객체에 특화된 기타 내부
슬롯을 가지지 않습니다.
23.2.7.1 TypedArray .prototype.BYTES_PER_ELEMENT
TypedArray .prototype.BYTES_PER_ELEMENT의 값은 표 75 에서
TypedArray 에 대해 명시된 요소 크기(Element Size) 값입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
23.2.7.2 TypedArray .prototype.constructor
프로토타입의 "constructor" 프로퍼티의 초기 값은 해당 TypedArray 생성자 자체입니다.
23.2.8 TypedArray 인스턴스의 속성
TypedArray 인스턴스는 TypedArrays 입니다. 각 TypedArray 인스턴스는 해당
TypedArray 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 TypedArray 인스턴스는 다음 내부 슬롯을 가집니다:
[[ViewedArrayBuffer]] , [[TypedArrayName]] ,
[[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] .
24 Keyed 컬렉션
24.1 Map 객체
Map은 키/값 쌍의 컬렉션으로, 키와 값 모두 임의의 ECMAScript 언어 값 가 될 수 있습니다. 서로 다른 키 값은
Map의 컬렉션 내에서 하나의 키/값 쌍에만 등장할 수 있습니다. 서로 다른 키 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별됩니다.
Map은 해시 테이블이나 평균적으로 컬렉션의 요소 수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘을 사용하여 구현되어야 합니다. 이 명세에서 사용되는
자료구조는 Map의 요구되는 관찰 가능한 의미론만을 설명하기 위한 것이며, 실제 구현 모델로는 적합하지 않습니다.
24.1.1 Map 생성자
Map 생성자 :
%Map% 입니다.
글로벌
객체 의 "Map" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 Map을 생성하고 초기화합니다.
함수로 호출되는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외를 던집니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Map 동작을 상속하려는 서브클래스 생성자 는 Map
생성자 에
super 호출을 포함하여 서브클래스 인스턴스가 Map.prototype 내장 메서드를 지원하는 데 필요한 내부 상태를
생성 및 초기화해야 합니다.
24.1.1.1 Map ( [ iterable ] )
이 함수는 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
map 을 ? OrdinaryCreateFromConstructor (NewTarget,
"%Map.prototype%" , « [[MapData]] »)로 설정합니다.
map .[[MapData]] 를 새로운 빈 List 로 설정합니다.
iterable 이 undefined 또는 null 이면
map 을 반환합니다.
adder 를 ? Get (map ,
"set" )로 설정합니다.
IsCallable (adder )가
false 이면 TypeError 예외를 throw합니다.
? AddEntriesFromIterable (map ,
iterable , adder )를 반환합니다.
참고
매개변수 iterable 이 존재하는 경우, %Symbol.iterator% 메서드를 구현한 객체로
예상되며, 이는 이터레이터 객체 를 반환해야 합니다. 해당 이터레이터는
첫 번째 요소가 Map의 키로 사용될 값이고, 두 번째 요소가 그 키에 연결할 값인 2개의 요소를 가진 배열 유사 객체 를 생성해야 합니다.
24.1.1.2 AddEntriesFromIterable ( target ,
iterable , adder )
추상 연산 AddEntriesFromIterable는 인수 target (객체), iterable (ECMAScript 언어 값 , 단
undefined 또는 null 은 아님), adder (함수
객체 )를 받고, 정상 완료(normal
completion) 로 ECMAScript 언어 값
또는 throw 완료 를 반환합니다.
adder 는 target 을 수신자로 하여 호출됩니다. 호출 시 다음 단계들을 수행합니다:
iteratorRecord 를 ? GetIterator (iterable ,
sync )로 설정합니다.
반복,
next 를 ? IteratorStepValue (iteratorRecord )로
설정합니다.
next 가 done 이면 target 을 반환합니다.
next 가 객체가 아니면 ,
error 를 ThrowCompletion (새로
생성한 TypeError 객체)로 설정합니다.
? IteratorClose (iteratorRecord ,
error )를 반환합니다.
k 를 Completion (Get (next ,
"0" ))로 설정합니다.
IfAbruptCloseIterator (k ,
iteratorRecord )를 수행합니다.
v 를 Completion (Get (next ,
"1" ))로 설정합니다.
IfAbruptCloseIterator (v ,
iteratorRecord )를 수행합니다.
status 를 Completion (Call (adder ,
target , « k , v »))로 설정합니다.
IfAbruptCloseIterator (status ,
iteratorRecord )를 수행합니다.
참고
매개변수 iterable 은 %Symbol.iterator% 메서드를 구현한 객체로
예상되며, 이는 이터레이터 객체 를 반환해야 합니다. 해당 이터레이터는
첫 번째 요소가 Map의 키로 사용될 값이고, 두 번째 요소가 그 키에 연결할 값인 2개의 요소를 가진 배열 유사 객체 를 생성해야 합니다.
24.1.2 Map 생성자의 속성
Map 생성자 :
24.1.2.1 Map.groupBy ( items , callback )
참고
callback 은 두 개의 인수를 받는 함수여야 합니다.
groupBy는 items 의 각 요소에 대해 오름차순으로 callback 을 한 번씩
호출하며, 새로운 Map을 구성합니다. callback 이 반환하는 각 값은 Map의 키로 사용됩니다. 해당 키마다 결과 Map에 그
키를 키로 하고 callback 이 해당 키를 반환한 모든 요소가 담긴 배열을 값으로 하는 엔트리가 생깁니다.
callback 은 요소의 값과 요소의 인덱스를 인수로 호출됩니다.
groupBy의 반환 값은 Map입니다.
이 함수는 호출될 때 다음 단계들을 수행합니다:
groups 를 ? GroupBy (items ,
callback , collection )로 설정합니다.
map 을 ! Construct (%Map% )로 설정합니다.
groups 의 각 Record { [[Key]] , [[Elements]] }
g 에 대해,
elements 를 CreateArrayFromList (g .[[Elements]] )로 설정합니다.
entry 를 Record
{ [[Key]] : g .[[Key]] , [[Value]] :
elements }로 설정합니다.
entry 를 map .[[MapData]] 에
추가합니다.
map 을 반환합니다.
24.1.2.2 Map.prototype
Map.prototype의 초기 값은 Map 프로토타입 객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
24.1.2.3 get Map [ %Symbol.species% ]
Map[%Symbol.species%]는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티의 값은 "get [Symbol.species]" 입니다.
참고
파생 컬렉션 객체를 생성하는 메서드는 %Symbol.species% 를 호출하여 파생 객체를
생성하는 데 사용할 생성자 를 결정해야 합니다. 서브클래스 생성자 는
기본 %Symbol.species% 할당을 변경하기 위해
오버라이드할 수 있습니다.
24.1.3 Map 프로토타입 객체의 속성
Map 프로토타입 객체 :
24.1.3.1 Map.prototype.clear ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 를 empty 로
설정합니다.
p .[[Value]] 를
empty 로 설정합니다.
undefined 를 반환합니다.
참고
기존 [[MapData]] List 는 보존됩니다.
이는 Map 이터레이터 객체 가 해당 List 를 순회하는
중단점에 있을 수 있기 때문입니다.
24.1.3.2 Map.prototype.constructor
Map.prototype.constructor의 초기 값은 %Map% 입니다.
24.1.3.3 Map.prototype.delete ( key )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면,
p .[[Key]] 를
empty 로 설정합니다.
p .[[Value]] 를
empty 로 설정합니다.
true 를 반환합니다.
false 를 반환합니다.
참고
empty 값은 명세 장치로, 엔트리가 삭제되었음을 나타냅니다. 실제 구현은 내부 자료구조에서 엔트리를
물리적으로 제거하는 등 다른 동작을 할 수 있습니다.
24.1.3.4 Map.prototype.entries ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? CreateMapIterator (M ,
key+value )를 반환합니다.
24.1.3.5 Map.prototype.forEach ( callback [ ,
thisArg ] )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
entries 를 M .[[MapData]] 로 설정합니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
index 를 0으로 설정합니다.
index < numEntries 인 동안 반복합니다,
e 를 entries [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e .[[Key]] 가 empty 가
아니면,
? Call (callback ,
thisArg , « e .[[Value]] , e .[[Key]] , M »)를 수행합니다.
참고: entries 의 요소 개수는 callback 실행 중 증가할 수 있습니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
undefined 를 반환합니다.
참고
callback 은 세 개의 인수를 받는 함수여야 합니다.
forEach는 Map에 존재하는 각 키/값 쌍에 대해 삽입 순서대로 callback 을 한 번씩 호출합니다.
callback 은 실제로 존재하는 키에 대해서만 호출되며, Map에서 삭제된 키에 대해서는 호출되지 않습니다.
thisArg 매개변수가 제공된 경우, 각 callback 호출의 this
값으로 사용됩니다. 제공되지 않은 경우 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수(값, 키, 순회되는 Map)를 받습니다.
forEach는 직접적으로 호출된 객체를 변경하지 않지만, callback 호출에 의해 객체가 변경될 수
있습니다. Map의 [[MapData]] 의 각 엔트리는 한 번만 방문됩니다.
forEach 호출 이후 추가된 새로운 키도 방문됩니다. 이미 방문한 키가 삭제되었다가 forEach가
완료되기 전에 다시 추가되면 다시 방문됩니다. forEach 호출 이후 삭제된 키는 다시 추가되지 않는 한 방문되지 않습니다.
24.1.3.6 Map.prototype.get ( key )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면
p .[[Value]] 를 반환합니다.
undefined 를 반환합니다.
24.1.3.7 Map.prototype.has ( key )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면
true 를 반환합니다.
false 를 반환합니다.
24.1.3.8 Map.prototype.keys ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? CreateMapIterator (M ,
key )를 반환합니다.
24.1.3.9 Map.prototype.set ( key , value )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
key 를 CanonicalizeKeyedCollectionKey (key )로
설정합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면,
p .[[Value]] 를 value 로
설정합니다.
M 을 반환합니다.
p 를 Record { [[Key]] : key , [[Value]] :
value }로 설정합니다.
p 를 M .[[MapData]] 에 추가합니다.
M 을 반환합니다.
24.1.3.10 get Map.prototype.size
Map.prototype.size는 접근자 프로퍼티 이며, set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[MapData]] )를 수행합니다.
count 를 0으로 설정합니다.
M .[[MapData]] 의 각 Record { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니면 count 를 count + 1로 설정합니다.
𝔽 (count )를 반환합니다.
24.1.3.11 Map.prototype.values ( )
이 메서드는 호출될 때 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? CreateMapIterator (M ,
value )를 반환합니다.
24.1.3.12 Map.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
24.1.3.4 에 정의된
%Map.prototype.entries%입니다.
24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은
"Map" 문자열 값입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
24.1.4 Map 인스턴스의 속성
Map 인스턴스는 일반
객체 이며, Map 프로토타입
객체 로부터 프로퍼티를 상속받습니다. Map 인스턴스는 [[MapData]] 내부 슬롯도
가집니다.
24.1.5 Map 이터레이터 객체
Map
이터레이터 는 특정 Map 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체입니다. Map 이터레이터 객체에는 명명된 생성자 가 없습니다. 대신, Map
이터레이터 객체는 특정 Map 인스턴스 객체의 메서드를 호출함으로써 생성됩니다.
24.1.5.1 CreateMapIterator ( map , kind )
추상 연산 CreateMapIterator는 인수 map (ECMAScript 언어
값 ), kind (key+value ,
key , value )를 받고, 정상 완료(normal
completion) 로 Generator 또는 throw 완료 를 반환합니다.
Map의 이터레이터 메서드에서 이터레이터 객체를 생성하기 위해 사용됩니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (map ,
[[MapData]] )를 수행합니다.
closure 를 파라미터가 없고 map 과 kind 를 캡처하여 호출 시 다음 단계들을 수행하는
새로운 추상 클로저(Abstract Closure) 로 설정합니다:
entries 를 map .[[MapData]] 로
설정합니다.
index 를 0으로 설정합니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
index < numEntries 인 동안 반복합니다,
e 를 entries [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e .[[Key]] 가
empty 가 아니면,
kind 가 key 이면,
result 를 e .[[Key]] 로 설정합니다.
그 밖의 경우 kind 가 value 이면,
result 를 e .[[Value]] 로 설정합니다.
그 밖의 경우,
Assert :
kind 는
key+value 입니다.
result 를 CreateArrayFromList («
e .[[Key]] ,
e .[[Value]] »)로 설정합니다.
? GeneratorYield (CreateIteratorResultObject (result ,
false ))를 수행합니다.
참고: entries 의 요소 개수는 GeneratorYield 로
인해 이 추상 연산의 실행이 일시 중지되는 동안 증가할 수 있습니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
NormalCompletion (unused )를
반환합니다.
CreateIteratorFromClosure (closure ,
"%MapIteratorPrototype%" , %MapIteratorPrototype% )를
반환합니다.
24.1.5.2 %MapIteratorPrototype% 객체
%MapIteratorPrototype% 객체:
24.1.5.2.1 %MapIteratorPrototype%.next ( )
? GeneratorResume (this
값, empty ,
"%MapIteratorPrototype%" )를 반환합니다.
24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은
문자열 값 "Map Iterator" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }입니다.
24.2 Set 객체
Set 객체는 ECMAScript 언어 값 의 컬렉션입니다. 구별되는 값은 Set의
컬렉션의 요소로 한 번만 등장할 수 있습니다. 구별되는 값은 SameValueZero 비교 알고리즘의 의미론을 이용해 구분됩니다.
Set 객체는 해시 테이블 또는 평균적으로 컬렉션 내의 요소 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 기타 메커니즘으로 구현되어야 합니다. 이 명세에서 사용된
데이터 구조는 Set 객체의 요구되는 관찰 가능한 의미론만을 설명하기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.
24.2.1 Set 객체에 대한 추상 연산
24.2.1.1 Set 레코드
Set 레코드 는 Set 또는 유사 객체의 인터페이스를 캡슐화하기 위해 사용되는
레코드 값입니다.
Set 레코드는 표 76 에 나열된 필드를 가집니다.
표 76: Set 레코드 필드
필드 이름
값
의미
[[SetObject]]
객체
Set 또는 유사 객체.
[[Size]]
0 이상의 정수 또는 +∞
객체가 보고하는 크기.
[[Has]]
함수 객체
객체의 has 메서드.
[[Keys]]
함수 객체
객체의 keys 메서드.
24.2.1.2 GetSetRecord ( obj )
추상 연산 GetSetRecord는 인수 obj (ECMAScript 언어
값 )를 받고, 정상 완료(normal
completion) 로 Set 레코드 또는 throw 완료 를 반환합니다. 호출
시 다음 단계들을 수행합니다:
obj 가 객체가 아니면 TypeError
예외를 throw합니다.
rawSize 를 ? Get (obj ,
"size" )로 설정합니다.
numSize 를 ? ToNumber (rawSize )로 설정합니다.
참고: rawSize 가 undefined 이면 numSize 는
NaN 입니다.
numSize 가 NaN 이면 TypeError 예외를
throw합니다.
intSize 를 ! ToIntegerOrInfinity (numSize )로
설정합니다.
intSize < 0이면 RangeError 예외를 throw합니다.
has 를 ? Get (obj ,
"has" )로 설정합니다.
IsCallable (has )가
false 이면 TypeError 예외를 throw합니다.
keys 를 ? Get (obj ,
"keys" )로 설정합니다.
IsCallable (keys )가
false 이면 TypeError 예외를 throw합니다.
새로운 Set
레코드 { [[SetObject]] : obj ,
[[Size]] : intSize , [[Has]] : has , [[Keys]] :
keys }를 반환합니다.
24.2.1.3 SetDataHas ( setData , value )
추상 연산 SetDataHas는 인수 setData (리스트 , 각 요소는 ECMAScript 언어 값 또는
empty ), value (ECMAScript 언어 값 )를 받고, Boolean을
반환합니다. 호출 시 다음 단계들을 수행합니다:
SetDataIndex (setData ,
value )가 not-found 이면 false 를
반환합니다.
true 를 반환합니다.
24.2.1.4 SetDataIndex ( setData , value )
추상 연산 SetDataIndex는 인수 setData (리스트 , 각 요소는 ECMAScript 언어 값 또는
empty ), value (ECMAScript 언어 값 )를 받고, 0 이상의
정수 또는
not-found 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
value 를 CanonicalizeKeyedCollectionKey (value )로
설정합니다.
size 를 setData 의 요소 개수로 설정합니다.
index 를 0으로 설정합니다.
index < size 인 동안 반복합니다,
e 를 setData [index ]로 설정합니다.
e 가 empty 가 아니고 e 가
value 이면,
index 를 반환합니다.
index 를 index + 1로 설정합니다.
not-found 를 반환합니다.
24.2.1.5 SetDataSize ( setData )
추상 연산 SetDataSize는 인수 setData (리스트 , 각 요소는 ECMAScript 언어 값 또는
empty )를 받고, 0 이상의 정수 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
count 를 0으로 설정합니다.
setData 의 각 요소 e 에 대해,
e 가 empty 가 아니면 count 를
count + 1로 설정합니다.
count 를 반환합니다.
24.2.2 Set 생성자
Set 생성자 :
내재 객체 %Set% 입니다.
글로벌
객체 의 "Set" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 Set 객체를 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Set 동작을 상속하려는 서브클래스 생성자 는
super 호출을 포함하여 Set 생성자 에 서브클래스 인스턴스가 Set.prototype 내장
메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
24.2.2.1 Set ( [ iterable ] )
이 함수는 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
set 을 ? OrdinaryCreateFromConstructor (NewTarget,
"%Set.prototype%" , « [[SetData]] »)로 설정합니다.
set .[[SetData]] 를 새로운 빈 리스트 로 설정합니다.
iterable 이 undefined 또는 null 이면
set 을 반환합니다.
adder 를 ? Get (set ,
"add" )로 설정합니다.
IsCallable (adder )가
false 이면 TypeError 예외를 throw합니다.
iteratorRecord 를 ? GetIterator (iterable ,
sync )로 설정합니다.
반복합니다,
next 를 ? IteratorStepValue (iteratorRecord )로
설정합니다.
next 가 done 이면 set 을 반환합니다.
status 를 Completion (Call (adder ,
set , « next »))로 설정합니다.
IfAbruptCloseIterator (status ,
iteratorRecord )를 수행합니다.
24.2.3 Set 생성자의 속성
Set 생성자 :
24.2.3.1 Set.prototype
Set.prototype의 초기 값은 Set 프로토타입 객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
24.2.3.2 get Set [ %Symbol.species% ]
Set[%Symbol.species%]는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
참고
파생 컬렉션 객체를 생성하는 메서드는 %Symbol.species% 를 호출해 파생 객체를
만드는데 사용할 생성자 를 결정해야 합니다. 서브클래스 생성자 는
%Symbol.species% 를 오버라이드하여 기본
생성자 할당을 변경할 수 있습니다.
24.2.4 Set 프로토타입 객체의 속성
Set 프로토타입 객체 :
24.2.4.1 Set.prototype.add ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
value 를 CanonicalizeKeyedCollectionKey (value )로
설정합니다.
S .[[SetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면,
S 를 반환합니다.
value 를 S .[[SetData]] 에 추가합니다.
S 를 반환합니다.
24.2.4.2 Set.prototype.clear ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
S .[[SetData]] 의 각 요소 e 에 대해,
S .[[SetData]] 에서 값이 e 인 요소를 값이
empty 인 요소로 대체합니다.
undefined 를 반환합니다.
참고
기존 [[SetData]] 리스트 는 보존됩니다.
왜냐하면 해당 리스트 를 반복 중인
Set Iterator 객체 가 존재할 수 있기
때문입니다.
24.2.4.3 Set.prototype.constructor
Set.prototype.constructor의 초기 값은 %Set% 입니다.
24.2.4.4 Set.prototype.delete ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
value 를 CanonicalizeKeyedCollectionKey (value )로
설정합니다.
S .[[SetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면,
S .[[SetData]] 에서 값이 e 인
요소를 값이 empty 인 요소로 대체합니다.
true 를 반환합니다.
false 를 반환합니다.
참고
empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을
물리적으로 제거하는 등 다른 동작을 할 수 있습니다.
24.2.4.5 Set.prototype.difference ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
resultSetData 를 O .[[SetData]] 의 복사본으로
설정합니다.
SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] 이면,
thisSize 를 O .[[SetData]] 의 요소
개수로 설정합니다.
index 를 0으로 설정합니다.
index < thisSize 인 동안 반복합니다,
e 를 resultSetData [index ]로 설정합니다.
e 가 empty 가 아니면,
inOther 를 ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »))로 설정합니다.
inOther 가 true 이면,
resultSetData [index ]를
empty 로 설정합니다.
index 를 index + 1로 설정합니다.
그 밖의 경우,
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
next 를 CanonicalizeKeyedCollectionKey (next )로
설정합니다.
valueIndex 를 SetDataIndex (resultSetData ,
next )로 설정합니다.
valueIndex 가 not-found 가
아니면,
resultSetData [valueIndex ]를
empty 로 설정합니다.
result 를 OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »)로 설정합니다.
result .[[SetData]] 를
resultSetData 로 설정합니다.
result 를 반환합니다.
24.2.4.6 Set.prototype.entries ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? CreateSetIterator (S ,
key+value )를 반환합니다.
참고
반복 목적상, Set은 각 항목의 key와 value가 동일한 값을 갖는 Map과 유사하게 동작합니다.
24.2.4.7 Set.prototype.forEach ( callback [ ,
thisArg ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
IsCallable (callback )가
false 이면 TypeError 예외를 throw합니다.
entries 를 S .[[SetData]] 로 설정합니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
index 를 0으로 설정합니다.
index < numEntries 인 동안 반복합니다,
e 를 entries [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e 가 empty 가 아니면,
? Call (callback ,
thisArg , « e , e ,
S »)를 수행합니다.
참고: entries 의 요소 개수는 callback 실행 중에 증가할 수 있습니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
undefined 를 반환합니다.
참고
callback 은 세 개의 인수를 받는 함수여야 합니다.
forEach는 Set 객체에 존재하는 각 값에 대해 값 삽입 순서대로 callback 을 한 번씩
호출합니다. callback 은 실제로 존재하는 값에 대해서만 호출되며, Set에서 삭제된 키에 대해서는 호출되지 않습니다.
thisArg 매개변수가 제공되면 callback 을 호출할 때 this 값으로
사용됩니다. 제공되지 않으면 undefined 가 대신 사용됩니다.
callback 은 세 개의 인수로 호출됩니다. 처음 두 인수는 Set에 포함된 값이며, 두 인수 모두 동일한 값이 전달됩니다. 세
번째 인수는 순회 중인 Set 객체입니다.
callback 이 세 개의 인수로 호출되는 이유는 Map과 Array의 forEach 메서드에서 사용되는 콜백
함수와 일관성을 유지하기 위함입니다. Set에서는 각 항목 값이 key와 value로 모두 간주됩니다.
forEach는 호출된 객체를 직접 변경하지 않지만, callback 호출로 인해 객체가 변경될 수 있습니다.
각 값은 일반적으로 한 번만 방문됩니다. 하지만, 값이 방문된 후 삭제되고 forEach 호출이 끝나기 전에 다시 추가되면 다시
방문될 수 있습니다. forEach 호출이 시작된 후 방문되기 전에 삭제된 값은 forEach가 완료되기
전에 다시 추가되지 않으면 방문되지 않습니다. forEach 호출이 시작된 후 추가된 새로운 값도 방문됩니다.
24.2.4.8 Set.prototype.has ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
value 를 CanonicalizeKeyedCollectionKey (value )로
설정합니다.
S .[[SetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면 true 를 반환합니다.
false 를 반환합니다.
24.2.4.9 Set.prototype.intersection ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
resultSetData 를 새로운 빈 리스트 로 설정합니다.
SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] 이면,
thisSize 를 O .[[SetData]] 의 요소
개수로 설정합니다.
index 를 0으로 설정합니다.
index < thisSize 인 동안 반복합니다,
e 를 O .[[SetData]] [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e 가 empty 가 아니면,
inOther 를 ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »))로 설정합니다.
inOther 가 true 이면,
참고: 이전 otherRec .[[Has]] 호출이
O .[[SetData]] 의
요소를 제거하고 다시 추가할 수 있으므로, 동일한 요소가 이 반복 중에 두 번 방문될 수
있습니다.
SetDataHas (resultSetData ,
e )가 false 이면,
e 를 resultSetData 에
추가합니다.
참고: O .[[SetData]] 의 요소
개수는 otherRec .[[Has]] 실행
중에 증가할 수 있습니다.
thisSize 를 O .[[SetData]] 의 요소 개수로 설정합니다.
그 밖의 경우,
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
next 를 CanonicalizeKeyedCollectionKey (next )로
설정합니다.
inThis 를 SetDataHas (O .[[SetData]] , next )로
설정합니다.
inThis 가 true 이면,
참고: other 는 임의의 객체이므로,
"keys" 이터레이터 가
동일한 값을 여러 번 생산할 수 있습니다.
SetDataHas (resultSetData ,
next )가 false 이면
next 를 resultSetData 에
추가합니다.
result 를 OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »)로 설정합니다.
result .[[SetData]] 를 resultSetData 로
설정합니다.
result 를 반환합니다.
24.2.4.10 Set.prototype.isDisjointFrom ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] 이면,
thisSize 를 O .[[SetData]] 의 요소
개수로 설정합니다.
index 를 0으로 설정합니다.
index < thisSize 인 동안 반복합니다,
e 를 O .[[SetData]] [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e 가 empty 가 아니면,
inOther 를 ToBoolean (?
Call (otherRec .[[Has]] , otherRec .[[SetObject]] , «
e »))로 설정합니다.
inOther 가 true 이면
false 를 반환합니다.
참고: O .[[SetData]] 의 요소
개수는 otherRec .[[Has]] 실행
중에 증가할 수 있습니다.
thisSize 를 O .[[SetData]] 의 요소 개수로 설정합니다.
그 밖의 경우,
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
SetDataHas (O .[[SetData]] , next )가
true 이면,
? IteratorClose (keysIter ,
NormalCompletion (unused )).
false 를 반환합니다.
true 를 반환합니다.
24.2.4.11 Set.prototype.isSubsetOf ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
SetDataSize (O .[[SetData]] ) > otherRec .[[Size]] 이면 false 를 반환합니다.
thisSize 를 O .[[SetData]] 의 요소 개수로
설정합니다.
index 를 0으로 설정합니다.
index < thisSize 인 동안 반복합니다,
e 를 O .[[SetData]] [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e 가 empty 가 아니면,
inOther 를 ToBoolean (? Call (otherRec .[[Has]] , otherRec .[[SetObject]] , « e »))로
설정합니다.
inOther 가 false 이면
false 를 반환합니다.
참고: O .[[SetData]] 의 요소 개수는
otherRec .[[Has]] 실행 중에 증가할 수
있습니다.
thisSize 를 O .[[SetData]] 의 요소 개수로 설정합니다.
true 를 반환합니다.
24.2.4.12 Set.prototype.isSupersetOf ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
SetDataSize (O .[[SetData]] ) < otherRec .[[Size]] 이면 false 를 반환합니다.
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
SetDataHas (O .[[SetData]] , next )가
false 이면,
? IteratorClose (keysIter ,
NormalCompletion (unused )).
false 를 반환합니다.
true 를 반환합니다.
24.2.4.13 Set.prototype.keys ( )
"keys" 프로퍼티의 초기 값은 24.2.4.17 에 정의된
%Set.prototype.values%입니다.
참고
반복 목적상, Set은 각 항목의 key와 value가 동일한 값을 갖는 Map과 유사하게 동작합니다.
24.2.4.14 get Set.prototype.size
Set.prototype.size는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[SetData]] )를 수행합니다.
size 를 SetDataSize (S .[[SetData]] )로 설정합니다.
𝔽 (size )를 반환합니다.
24.2.4.15 Set.prototype.symmetricDifference ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
resultSetData 를 O .[[SetData]] 의 복사본으로
설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
next 를 CanonicalizeKeyedCollectionKey (next )로
설정합니다.
resultIndex 를 SetDataIndex (resultSetData ,
next )로 설정합니다.
resultIndex 가 not-found 이면
alreadyInResult 를 false 로, 아니면
true 로 설정합니다.
SetDataHas (O .[[SetData]] , next )가
true 이면,
alreadyInResult 가 true 이면
resultSetData [resultIndex ]를
empty 로 설정합니다.
그 밖의 경우,
alreadyInResult 가 false 이면
next 를 resultSetData 에 추가합니다.
result 를 OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »)로 설정합니다.
result .[[SetData]] 를
resultSetData 로 설정합니다.
result 를 반환합니다.
24.2.4.16 Set.prototype.union ( other )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[SetData]] )를 수행합니다.
otherRec 를 ? GetSetRecord (other )로 설정합니다.
keysIter 를 ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )로 설정합니다.
resultSetData 를 O .[[SetData]] 의 복사본으로
설정합니다.
next 를 not-started 로 설정합니다.
next 가 done 가 아닐 동안 반복합니다,
next 를 ? IteratorStepValue (keysIter )로
설정합니다.
next 가 done 가 아니면,
next 를 CanonicalizeKeyedCollectionKey (next )로
설정합니다.
SetDataHas (resultSetData ,
next )가 false 이면,
next 를 resultSetData 에 추가합니다.
result 를 OrdinaryObjectCreate (%Set.prototype% ,
« [[SetData]] »)로 설정합니다.
result .[[SetData]] 를
resultSetData 로 설정합니다.
result 를 반환합니다.
24.2.4.17 Set.prototype.values ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? CreateSetIterator (S ,
value )를 반환합니다.
24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% 프로퍼티의 초기 값은
24.2.4.17 에 정의된
%Set.prototype.values%입니다.
24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"Set" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
24.2.5 Set 인스턴스의 속성
Set 인스턴스는 일반
객체 이며,
Set 프로토타입 객체 로부터 프로퍼티를
상속받습니다.
Set 인스턴스는 [[SetData]] 내부 슬롯도 가집니다.
24.2.6 Set 이터레이터 객체
Set
이터레이터 는 아래에 정의된 구조를 가지는 일반 객체 이며, 특정 Set 인스턴스 객체에 대한 특정 반복을 나타냅니다. Set
이터레이터 객체에 대한 명명된 생성자 는 존재하지 않습니다. 대신, Set 이터레이터 객체는 Set 인스턴스 객체의 특정
메서드를 호출하여 생성됩니다.
24.2.6.1 CreateSetIterator ( set , kind )
추상 연산 CreateSetIterator는 set (ECMAScript 언어
값 )과 kind (key+value 또는
value ) 인수를 받고,
정상 완료로 Generator 또는
throw 완료 를 반환합니다. 이
연산은 Set 메서드가 반환하는 이터레이터 객체 를 생성할 때 사용됩니다. 호출 시 다음 단계들을
수행합니다:
? RequireInternalSlot (set ,
[[SetData]] )를 수행합니다.
closure 를 파라미터가 없고 set 과 kind 를 캡처하는 새로운 추상
클로저 로 설정합니다. 이 클로저가 호출될 때 다음 단계들을 수행합니다:
index 를 0으로 설정합니다.
entries 를 set .[[SetData]] 로
설정합니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
index < numEntries 인 동안 반복합니다,
e 를 entries [index ]로 설정합니다.
index 를 index + 1로 설정합니다.
e 가 empty 가 아니면,
kind 가 key+value 이면,
result 를 CreateArrayFromList («
e , e »)로 설정합니다.
? GeneratorYield (CreateIteratorResultObject (result ,
false ))를 수행합니다.
그 밖의 경우,
Assert :
kind 는 value 입니다.
? GeneratorYield (CreateIteratorResultObject (e ,
false ))를 수행합니다.
참고: entries 의 요소 개수는 GeneratorYield 에
의해 이 추상 연산의 실행이 일시 중지되는 동안 증가할 수 있습니다.
numEntries 를 entries 의 요소 개수로 설정합니다.
NormalCompletion (unused )를
반환합니다.
CreateIteratorFromClosure (closure ,
"%SetIteratorPrototype%" , %SetIteratorPrototype% )를
반환합니다.
24.2.6.2 %SetIteratorPrototype% 객체
%SetIteratorPrototype% 객체:
24.2.6.2.1 %SetIteratorPrototype%.next ( )
? GeneratorResume (this
값, empty ,
"%SetIteratorPrototype%" )를 반환합니다.
24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은
문자열 값 "Set Iterator" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }입니다.
24.3 WeakMap 객체
WeakMap은 키가 객체 및/또는 심볼이고 값이 임의의 ECMAScript 언어 값 일 수 있는 키/값 쌍의 컬렉션입니다.
WeakMap은 특정 키를 가진 키/값 쌍을 포함하는지 확인할 수 있지만, 키로 가지고 있는 값을 열거하는 메커니즘은 제공되지 않습니다. 특정 조건에서는 live 가 아닌 값이 WeakMap
키로부터 제거됩니다. 이에 대한 자세한 내용은 9.9.3 에서 설명합니다.
구현체는 WeakMap의 키/값 쌍이 접근 불가능해진 시점과 WeakMap에서 키/값 쌍이 제거되는 시점 사이에 임의로 결정한 지연(latency)을 둘 수 있습니다. 이 지연이
ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 미칠 수 있는 불확정성(indeterminacy)의 원인이 됩니다. 따라서 ECMAScript 구현체는
관찰자가 관찰하려는 키를 직접 제시하지 않고서는 WeakMap의 키를 관찰할 수 있는 방법을 제공해서는 안 됩니다.
WeakMap은 해시 테이블 또는 평균적으로 컬렉션의 키/값 쌍 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘으로 구현되어야 합니다. 본 명세에서
사용되는 데이터 구조는 WeakMap의 요구되는 관찰 가능 의미론만을 나타내기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.
참고
WeakMap과 WeakSet은 객체 또는 심볼과 동적으로 상태를 연관시키는 메커니즘을 제공하기 위해 만들어졌으며, WeakMap 또는 WeakSet 인스턴스가 없을
경우 객체 또는 심볼이 접근 불가능해져서 구현체의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되는 상황에서 메모리 자원이 “누수”되지 않도록 합니다. 이런
특성은 WeakMap 또는 WeakSet 인스턴스에서 키에 대해 역방향(per-object/symbol) 매핑을 사용하는 방법으로 달성할 수 있습니다. 또는 각
WeakMap/WeakSet 인스턴스가 내부적으로 키와 값 데이터를 저장할 수도 있지만, 이 방식은 WeakMap/WeakSet 구현과 가비지 컬렉터 간의 협력이
필요합니다. 다음 참조 문헌들은 WeakMap과 WeakSet 구현에 유용할 수 있는 메커니즘을 설명합니다:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th
ACM SIGPLAN conference on Object-oriented programming, systems, languages, and
applications (OOPSLA '97) , A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183,
http://doi.acm.org/10.1145/263698.263733 .
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of
Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
24.3.1 WeakMap 생성자
WeakMap 생성자 :
%WeakMap% 입니다.
글로벌
객체 의 "WeakMap" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 WeakMap을 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 WeakMap 동작을 상속하려는 서브클래스 생성자 는
super 호출을 포함하여 WeakMap 생성자 에 서브클래스 인스턴스가 WeakMap.prototype
내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
24.3.1.1 WeakMap ( [ iterable ] )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
map 을 ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakMap.prototype%" , « [[WeakMapData]] »)로 설정합니다.
map .[[WeakMapData]] 를 새로운 빈 리스트 로 설정합니다.
iterable 이 undefined 또는 null 이면
map 을 반환합니다.
adder 를 ? Get (map ,
"set" )로 설정합니다.
IsCallable (adder )가
false 이면 TypeError 예외를 throw합니다.
? AddEntriesFromIterable (map ,
iterable , adder )를 반환합니다.
참고
매개변수 iterable 이 존재하는 경우, %Symbol.iterator% 메서드를 구현한
객체여야 하며, 이 메서드는 이터레이터 객체 를 반환하고, 이터레이터 객체는 첫 번째
요소가 WeakMap 키로 사용될 값, 두 번째 요소가 그 키와 연관될 값인 두 요소의 array-like 객체 를 생성합니다.
24.3.2 WeakMap 생성자의 속성
WeakMap 생성자 :
24.3.2.1 WeakMap.prototype
WeakMap.prototype의 초기 값은 WeakMap 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
24.3.3 WeakMap 프로토타입 객체의 속성
WeakMap 프로토타입 객체 :
%WeakMap.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[WeakMapData]] 내부 슬롯을 가지지 않습니다.
24.3.3.1 WeakMap.prototype.constructor
WeakMap.prototype.constructor의 초기 값은 %WeakMap% 입니다.
24.3.3.2 WeakMap.prototype.delete ( key )
이 메서드는 호출 시 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[WeakMapData]] )를 수행합니다.
CanBeHeldWeakly (key )
가 false 이면, false 를 반환합니다.
M .[[WeakMapData]] 의 각 레코드 { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면,
p .[[Key]] 를
empty 로 설정합니다.
p .[[Value]] 를
empty 로 설정합니다.
true 를 반환합니다.
false 를 반환합니다.
참고
empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을
물리적으로 제거하는 등 다른 동작을 할 수 있습니다.
24.3.3.3 WeakMap.prototype.get ( key )
이 메서드는 호출 시 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[WeakMapData]] )를 수행합니다.
CanBeHeldWeakly (key )
가 false 이면, undefined 를 반환합니다.
M .[[WeakMapData]] 의 각 레코드 { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면
p .[[Value]] 를 반환합니다.
undefined 를 반환합니다.
24.3.3.4 WeakMap.prototype.has ( key )
이 메서드는 호출 시 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[WeakMapData]] )를 수행합니다.
CanBeHeldWeakly (key )
가 false 이면, false 를 반환합니다.
M .[[WeakMapData]] 의 각 레코드 { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면
true 를 반환합니다.
false 를 반환합니다.
24.3.3.5 WeakMap.prototype.set ( key ,
value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
M 을 this 값으로 설정합니다.
? RequireInternalSlot (M ,
[[WeakMapData]] )를 수행합니다.
CanBeHeldWeakly (key )
가 false 이면 TypeError 예외를 throw합니다.
M .[[WeakMapData]] 의 각 레코드 { [[Key]] , [[Value]] }
p 에 대해,
p .[[Key]] 가 empty 가
아니고 SameValue (p .[[Key]] , key )가 true 이면,
p .[[Value]] 를 value 로
설정합니다.
M 을 반환합니다.
p 를 레코드 { [[Key]] : key , [[Value]] :
value }로 설정합니다.
p 를 M .[[WeakMapData]] 에 추가합니다.
M 을 반환합니다.
24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"WeakMap" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
24.3.4 WeakMap 인스턴스의 속성
WeakMap 인스턴스는 일반
객체 이며,
WeakMap 프로토타입
객체 로부터 프로퍼티를 상속받습니다.
WeakMap 인스턴스는 [[WeakMapData]] 내부 슬롯도 가집니다.
24.4 WeakSet 객체
WeakSet은 객체 및/또는 심볼의 컬렉션입니다. 구별되는 객체 또는 심볼은 WeakSet 컬렉션의 요소로 한 번만 등장할 수 있습니다. WeakSet은 특정 값을 포함하는지
확인할 수 있지만, 포함된 값을 열거하는 메커니즘은 제공되지 않습니다. 특정 조건에서는 live 가 아닌 값이 WeakSet 요소에서 제거됩니다. 이에 대한 자세한 내용은 9.9.3 에서 설명합니다.
구현체는 WeakSet에 포함된 값이 접근 불가능해진 시점과 값이 WeakSet에서 제거되는 시점 사이에 임의로 결정한 지연(latency)을 둘 수 있습니다. 이 지연이
ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 미칠 수 있는 불확정성(indeterminacy)의 원인이 됩니다. 따라서 ECMAScript 구현체는
관찰자가 관찰하려는 값을 직접 제시하지 않고서는 WeakSet이 특정 값을 포함하는지 확인할 수 있는 방법을 제공해서는 안 됩니다.
WeakSet은 해시 테이블 또는 평균적으로 컬렉션의 요소 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘으로 구현되어야 합니다. 본 명세에서 사용되는
데이터 구조는 WeakSet의 요구되는 관찰 가능 의미론만을 나타내기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.
참고
24.4.1 WeakSet 생성자
WeakSet 생성자 :
%WeakSet% 입니다.
글로벌
객체 의 "WeakSet" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 WeakSet을 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 WeakSet 동작을 상속하려는 서브클래스 생성자 는
super 호출을 포함하여 WeakSet 생성자 에 서브클래스 인스턴스가 WeakSet.prototype
내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
24.4.1.1 WeakSet ( [ iterable ] )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
set 을 ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakSet.prototype%" , « [[WeakSetData]] »)로 설정합니다.
set .[[WeakSetData]] 를 새로운 빈 리스트 로 설정합니다.
iterable 이 undefined 또는 null 이면
set 을 반환합니다.
adder 를 ? Get (set ,
"add" )로 설정합니다.
IsCallable (adder )가
false 이면 TypeError 예외를 throw합니다.
iteratorRecord 를 ? GetIterator (iterable ,
sync )로 설정합니다.
반복합니다,
next 를 ? IteratorStepValue (iteratorRecord )로
설정합니다.
next 가 done 이면 set 을 반환합니다.
status 를 Completion (Call (adder ,
set , « next »))로 설정합니다.
IfAbruptCloseIterator (status ,
iteratorRecord )를 수행합니다.
24.4.2 WeakSet 생성자의 속성
WeakSet 생성자 :
24.4.2.1 WeakSet.prototype
WeakSet.prototype의 초기 값은 WeakSet 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
24.4.3 WeakSet 프로토타입 객체의 속성
WeakSet 프로토타입 객체 :
%WeakSet.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[WeakSetData]] 내부 슬롯을 가지지 않습니다.
24.4.3.1 WeakSet.prototype.add ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[WeakSetData]] )를 수행합니다.
CanBeHeldWeakly (value )
가 false 이면 TypeError 예외를 throw합니다.
S .[[WeakSetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면,
S 를 반환합니다.
value 를 S .[[WeakSetData]] 에 추가합니다.
S 를 반환합니다.
24.4.3.2 WeakSet.prototype.constructor
WeakSet.prototype.constructor의 초기 값은 %WeakSet% 입니다.
24.4.3.3 WeakSet.prototype.delete ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[WeakSetData]] )를 수행합니다.
CanBeHeldWeakly (value )
가 false 이면 false 를 반환합니다.
S .[[WeakSetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면,
S .[[WeakSetData]] 에서 값이
e 인 요소를 값이 empty 인 요소로 대체합니다.
true 를 반환합니다.
false 를 반환합니다.
참고
empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을
물리적으로 제거하는 등 다른 동작을 할 수 있습니다.
24.4.3.4 WeakSet.prototype.has ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
S 를 this 값으로 설정합니다.
? RequireInternalSlot (S ,
[[WeakSetData]] )를 수행합니다.
CanBeHeldWeakly (value )
가 false 이면 false 를 반환합니다.
S .[[WeakSetData]] 의 각 요소 e 에 대해,
e 가 empty 가 아니고 SameValue (e ,
value )가 true 이면 true 를 반환합니다.
false 를 반환합니다.
24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"WeakSet" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
24.4.4 WeakSet 인스턴스의 속성
WeakSet 인스턴스는 일반
객체 이며,
WeakSet 프로토타입
객체 로부터 프로퍼티를 상속받습니다.
WeakSet 인스턴스는 [[WeakSetData]] 내부 슬롯도 가집니다.
24.5 키드 컬렉션을 위한 추상 연산
24.5.1 CanonicalizeKeyedCollectionKey ( key )
추상 연산 CanonicalizeKeyedCollectionKey는 인수 key (ECMAScript 언어 값 )를 받고
ECMAScript 언어 값 를 반환합니다. 호출 시 다음
단계들을 수행합니다:
key 가 -0 𝔽 이면 +0 𝔽 를
반환합니다.
key 를 반환합니다.
25 구조화된 데이터
25.1 ArrayBuffer 객체
25.1.1 표기법
아래 기술된 설명과 25.4 , 29 에서는 read-modify-write 수정 함수 내부
데이터 구조를 사용합니다.
read-modify-write 수정
함수 는 두 개의 리스트 와
바이트
값 를 인자로 받아 리스트 를 반환하는
추상 클로저로 표현되는 수학적 함수입니다. 이 추상 클로저는 다음의 모든 특성을 만족합니다:
알고리즘의 모든 단계가 원자적으로 수행됩니다.
각 단계별 알고리즘은 관찰할 수 없습니다.
참고
read-modify-write 수정 함수의 알고리즘 단계가 순수한 수학적 함수임을 검증하기 위해 다음과 같은 편집 규약을 권장합니다:
25.1.2 고정 길이 및 크기 조절 가능한 ArrayBuffer 객체
고정 길이 ArrayBuffer 는 생성 후 바이트 길이가 변경될 수 없는 ArrayBuffer입니다.
크기 조절 가능한 ArrayBuffer 는 ArrayBuffer.prototype.resize (
newLength ) 호출을 통해 생성 후 바이트 길이가 변경될 수 있는 ArrayBuffer입니다.
생성되는 ArrayBuffer 객체의 종류는 ArrayBuffer ( length [ , options ]
) 에 전달되는 인자에 따라 결정됩니다.
25.1.3 ArrayBuffer 객체를 위한 추상 연산
25.1.3.1 AllocateArrayBuffer ( constructor ,
byteLength [ , maxByteLength ] )
추상 연산 AllocateArrayBuffer는 인자 constructor (생성자 ), byteLength (0 이상의
정수 ), 선택적 인자
maxByteLength (0 이상의 정수 또는 empty )를 받고, 정상 완료로 ArrayBuffer
또는 throw 완료 를 반환합니다. 이
연산은 ArrayBuffer를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:
slots 를 « [[ArrayBufferData]] , [[ArrayBufferByteLength]] , [[ArrayBufferDetachKey]] »로 설정합니다.
maxByteLength 가 존재하며 maxByteLength 가
empty 가 아니면, allocatingResizableBuffer 를
true 로, 그렇지 않으면 false 로 설정합니다.
allocatingResizableBuffer 가 true 이면,
byteLength > maxByteLength 이면
RangeError 예외를 throw합니다.
[[ArrayBufferMaxByteLength]] 를 slots 에
추가합니다.
obj 를 ? OrdinaryCreateFromConstructor (constructor ,
"%ArrayBuffer.prototype%" , slots )로 설정합니다.
block 을 ? CreateByteDataBlock (byteLength )로
설정합니다.
obj .[[ArrayBufferData]] 에 block 을
설정합니다.
obj .[[ArrayBufferByteLength]] 에
byteLength 를 설정합니다.
allocatingResizableBuffer 가 true 이면,
maxByteLength 바이트로 구성된 Data Block
block 을 생성할 수 없다면 RangeError 예외를 throw합니다.
참고: 크기 조절 가능한 ArrayBuffer는 제자리(in-place) 확장이 가능하도록 설계되어 있습니다. 구현체는 예를 들어 가상
메모리를 미리 예약할 수 없는 경우 throw할 수 있습니다.
obj .[[ArrayBufferMaxByteLength]] 에
maxByteLength 를 설정합니다.
obj 를 반환합니다.
25.1.3.2 ArrayBufferByteLength ( arrayBuffer ,
order )
추상 연산 ArrayBufferByteLength는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)와
order (seq-cst 또는
unordered )를 받아 0 이상의 정수 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
IsSharedArrayBuffer (arrayBuffer )
가 true 이고 arrayBuffer 가 [[ArrayBufferByteLengthData]] 내부 슬롯을 가지고 있으면,
bufferByteLengthBlock 을 arrayBuffer .[[ArrayBufferByteLengthData]] 로 설정합니다.
rawLength 를 GetRawBytesFromSharedBlock (bufferByteLengthBlock ,
0, biguint64 , true ,
order )로 설정합니다.
isLittleEndian 을 주변 에이전트 의
에이전트
레코드 의 [[LittleEndian]] 필드 값으로
설정합니다.
ℝ (RawBytesToNumeric (biguint64 ,
rawLength , isLittleEndian ))를 반환합니다.
Assert :
IsDetachedBuffer (arrayBuffer )
가 false 임을 확인합니다.
arrayBuffer .[[ArrayBufferByteLength]] 를 반환합니다.
25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer ,
newLength , preserveResizability )
추상 연산 ArrayBufferCopyAndDetach는 인자 arrayBuffer (ECMAScript 언어 값 ),
newLength (ECMAScript 언어 값 ),
preserveResizability (preserve-resizability 또는
fixed-length )를 받고, 정상 완료로 ArrayBuffer
또는 throw 완료 를 반환합니다. 호출
시 다음 단계들을 수행합니다:
? RequireInternalSlot (arrayBuffer ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (arrayBuffer )
가 true 이면 TypeError 예외를 throw합니다.
newLength 가 undefined 이면,
newByteLength 를 arrayBuffer .[[ArrayBufferByteLength]] 로 설정합니다.
그 밖의 경우,
newByteLength 를 ? ToIndex (newLength )로
설정합니다.
IsDetachedBuffer (arrayBuffer )
가 true 이면 TypeError 예외를 throw합니다.
preserveResizability 가 preserve-resizability 이고
IsFixedLengthArrayBuffer (arrayBuffer )
가 false 이면,
newMaxByteLength 를 arrayBuffer .[[ArrayBufferMaxByteLength]] 로 설정합니다.
그 밖의 경우,
newMaxByteLength 를 empty 로 설정합니다.
arrayBuffer .[[ArrayBufferDetachKey]] 가
undefined 가 아니면 TypeError 예외를 throw합니다.
newBuffer 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
newByteLength , newMaxByteLength )로 설정합니다.
copyLength 를 min (newByteLength ,
arrayBuffer .[[ArrayBufferByteLength]] )로 설정합니다.
fromBlock 을 arrayBuffer .[[ArrayBufferData]] 로 설정합니다.
toBlock 을 newBuffer .[[ArrayBufferData]] 로 설정합니다.
CopyDataBlockBytes (toBlock ,
0, fromBlock , 0, copyLength )를 수행합니다.
참고: 새로운 Data Block 생성이나 기존 Data
Block 에서 복사는 관찰할 수 없습니다.
구현체는 이 메서드를 zero-copy 이동 또는 realloc으로 구현할 수 있습니다.
! DetachArrayBuffer (arrayBuffer )를
수행합니다.
newBuffer 를 반환합니다.
25.1.3.4 IsDetachedBuffer ( arrayBuffer )
추상 연산 IsDetachedBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)를 받아
Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:
arrayBuffer .[[ArrayBufferData]] 가
null 이면 true 를 반환합니다.
false 를 반환합니다.
25.1.3.5 DetachArrayBuffer ( arrayBuffer [ ,
key ] )
추상 연산 DetachArrayBuffer는 인자 arrayBuffer (ArrayBuffer)와 선택적 인자 key (임의
타입)를 받아 정상 완료로
unused 또는 throw
완료 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsSharedArrayBuffer (arrayBuffer )
가 false 임을 확인합니다.
key 가 존재하지 않으면 key 를 undefined 로 설정합니다.
arrayBuffer .[[ArrayBufferDetachKey]] 가
key 와 다르면 TypeError 예외를 throw합니다.
arrayBuffer .[[ArrayBufferData]] 를
null 로 설정합니다.
arrayBuffer .[[ArrayBufferByteLength]] 를 0으로
설정합니다.
unused 를 반환합니다.
참고
ArrayBuffer 인스턴스를 detach하면 Data Block 과 인스턴스의 연결이 해제되고 버퍼의 바이트
길이가 0으로 설정됩니다.
25.1.3.6 CloneArrayBuffer ( srcBuffer ,
srcByteOffset , srcLength )
추상 연산 CloneArrayBuffer는 인자 srcBuffer (ArrayBuffer 또는 SharedArrayBuffer),
srcByteOffset (0 이상의 정수 ), srcLength (0 이상의 정수 )를 받고, 정상 완료로 ArrayBuffer
또는 throw 완료 를 반환합니다.
srcBuffer 의 데이터 중 srcByteOffset 에서 시작해 srcLength 바이트만큼 복사한
데이터를 가진 새로운 ArrayBuffer를 생성합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsDetachedBuffer (srcBuffer )
가 false 임을 확인합니다.
targetBuffer 를 ? AllocateArrayBuffer (%ArrayBuffer% ,
srcLength )로 설정합니다.
srcBlock 을 srcBuffer .[[ArrayBufferData]] 로 설정합니다.
targetBlock 을 targetBuffer .[[ArrayBufferData]] 로 설정합니다.
CopyDataBlockBytes (targetBlock ,
0, srcBlock , srcByteOffset , srcLength )를 수행합니다.
targetBuffer 를 반환합니다.
25.1.3.7 GetArrayBufferMaxByteLengthOption ( options
)
추상 연산 GetArrayBufferMaxByteLengthOption은 인자 options
(ECMAScript 언어 값 )를 받고,
정상 완료로 0 이상의
정수 또는
empty , 또는 throw
완료 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
options 가 객체가 아니면 empty 를
반환합니다.
maxByteLength 를 ? Get (options ,
"maxByteLength" )로 설정합니다.
maxByteLength 가 undefined 이면
empty 를 반환합니다.
? ToIndex (maxByteLength )를 반환합니다.
25.1.3.8 HostResizeArrayBuffer ( buffer ,
newByteLength )
호스트 정의
추상 연산 HostResizeArrayBuffer는 인자 buffer (ArrayBuffer)와
newByteLength (0 이상의 정수 )를 받고, 정상 완료로
handled 또는
unhandled 또는 throw 완료 를 반환합니다. 이
연산은 호스트 가
구현 정의 방식으로 buffer 를 리사이즈할
기회를 제공합니다. 호스트 가 리사이즈를
처리하지 않기로 선택하면, 기본 동작에 대해 unhandled 를 반환할 수 있습니다.
HostResizeArrayBuffer의 구현은 다음 요구사항을 따라야 합니다:
이 추상 연산은 buffer 를 detach하지 않습니다.
정상적으로 handled 로 완료되면,
buffer .[[ArrayBufferByteLength]] 는
newByteLength 입니다.
HostResizeArrayBuffer의 기본 구현은 NormalCompletion (unhandled )를
반환하는 것입니다.
25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )
추상 연산 IsFixedLengthArrayBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)를
받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:
arrayBuffer 가 [[ArrayBufferMaxByteLength]] 내부 슬롯을
가지고 있으면 false 를 반환합니다.
true 를 반환합니다.
25.1.3.10 IsUnsignedElementType ( type )
추상 연산 IsUnsignedElementType은 인자 type (TypedArray 요소 타입 )을 받아
Boolean을 반환합니다.
type 이 unsigned TypedArray 요소 타입 인지 확인합니다. 호출 시 다음 단계들을
수행합니다:
type 이 uint8 ,
uint8clamped , uint16 ,
uint32 , biguint64 중 하나이면
true 를 반환합니다.
false 를 반환합니다.
25.1.3.11 IsUnclampedIntegerElementType ( type )
추상 연산 IsUnclampedIntegerElementType은 인자 type (TypedArray 요소 타입 )을 받아 Boolean을 반환합니다.
type 이 정수 TypedArray 요소 타입 이며
uint8clamped 은 제외하는지 확인합니다. 호출 시 다음 단계들을 수행합니다:
type 이 int8 ,
uint8 , int16 ,
uint16 , int32 ,
uint32 중 하나이면 true 를 반환합니다.
false 를 반환합니다.
25.1.3.12 IsBigIntElementType ( type )
추상 연산 IsBigIntElementType은 인자 type (TypedArray 요소 타입 )을 받아
Boolean을 반환합니다.
type 이 BigInt
TypedArray 요소 타입 인지 확인합니다. 호출 시 다음 단계들을
수행합니다:
type 이 biguint64 또는
bigint64 이면 true 를 반환합니다.
false 를 반환합니다.
25.1.3.13 IsNoTearConfiguration ( type ,
order )
추상 연산 IsNoTearConfiguration은 인자 type (TypedArray 요소 타입 )과
order (seq-cst , unordered ,
init )를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:
IsUnclampedIntegerElementType (type )
이 true 이면 true 를 반환합니다.
IsBigIntElementType (type )
이 true 이고 order 가 init 또는
unordered 가 아니면 true 를 반환합니다.
false 를 반환합니다.
25.1.3.14 RawBytesToNumeric ( type ,
rawBytes , isLittleEndian )
추상 연산 RawBytesToNumeric은 인자 type (TypedArray 요소 타입 ),
rawBytes (리스트 of
바이트
값 ), isLittleEndian (Boolean)을 받고 Number 또는 BigInt를 반환합니다.
호출 시 다음 단계들을 수행합니다:
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
isLittleEndian 이 false 이면 rawBytes 의 요소 순서를
반대로 합니다.
type 이 float16 이면,
value 를 rawBytes 의 바이트 요소를 이어붙여 little-endian 비트 문자열로
해석하여 IEEE 754-2019 binary16 값을
인코딩합니다.
value 가 NaN이면 NaN 를 반환합니다.
value 에 해당하는 Number 값을 반환합니다.
type 이 float32 이면,
value 를 rawBytes 의 바이트 요소를 이어붙여 little-endian 비트 문자열로
해석하여 IEEE 754-2019 binary32 값을
인코딩합니다.
value 가 NaN이면 NaN 를 반환합니다.
value 에 해당하는 Number 값을 반환합니다.
type 이 float64 이면,
value 를 rawBytes 의 바이트 요소를 이어붙여 little-endian 비트 문자열로
해석하여 IEEE 754-2019 binary64 값을
인코딩합니다.
value 가 NaN이면 NaN 를 반환합니다.
value 에 해당하는 Number 값을 반환합니다.
IsUnsignedElementType (type )
이 true 이면,
intValue 를 rawBytes 의 바이트 요소를 이어붙여 unsigned
little-endian 이진수로 해석합니다.
그 밖의 경우,
intValue 를 rawBytes 의 바이트 요소를 이어붙여
elementSize × 8 비트 길이의 이진 little-endian 2의 보수수로 해석합니다.
IsBigIntElementType (type )
이 true 이면 intValue 에 해당하는 BigInt 값을 반환합니다.
그 밖의 경우 intValue 에 해당하는 Number 값을 반환합니다.
25.1.3.15 GetRawBytesFromSharedBlock ( block ,
byteIndex , type , isTypedArray , order )
추상 연산 GetRawBytesFromSharedBlock은 인자 block (공유 데이터 블록 ),
byteIndex (0 이상의 정수 ), type (TypedArray 요소 타입 ),
isTypedArray (Boolean), order (seq-cst 또는
unordered )를 받고, 리스트 of 바이트 값 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
execution 을 주변 에이전트 의 에이전트
레코드 의 [[CandidateExecution]] 필드로
설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로 설정합니다.
isTypedArray 가 true 이고 IsNoTearConfiguration (type ,
order )가 true 이면 noTear 를
true 로, 아니면 false 로 설정합니다.
rawValue 를 elementSize 길이의 리스트 로 설정하고, 각
요소는 비결정적으로 선택된 바이트 값 입니다.
참고: 구현에서는 rawValue 는 하드웨어에서 비원자적 또는 원자적 읽기 명령 결과입니다. 비결정성은 메모리
모델 의 약한 일관성 하드웨어의 관찰 가능한 동작을 설명하기 위한 의미론적 규정입니다.
readEvent 를 ReadSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize }로 설정합니다.
readEvent 를 eventsRecord .[[EventList]] 에 추가합니다.
Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : rawValue }를
execution .[[ChosenValues]] 에 추가합니다.
rawValue 를 반환합니다.
25.1.3.16 GetValueFromBuffer ( arrayBuffer ,
byteIndex , type , isTypedArray , order [ ,
isLittleEndian ] )
추상 연산 GetValueFromBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer),
byteIndex (0 이상의 정수 ), type (TypedArray 요소 타입 ),
isTypedArray (Boolean), order (seq-cst 또는
unordered ), 선택적 인자 isLittleEndian (Boolean)을 받고 Number 또는
BigInt를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsDetachedBuffer (arrayBuffer )가
false 임을 확인합니다.
Assert :
arrayBuffer 의 byteIndex 부터 type 값을 표현할 충분한 바이트가 있어야
합니다.
block 을 arrayBuffer .[[ArrayBufferData]] 로 설정합니다.
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
IsSharedArrayBuffer (arrayBuffer )가
true 이면,
Assert : block 은 공유
데이터 블록 이어야 합니다.
rawValue 를 GetRawBytesFromSharedBlock (block ,
byteIndex , type , isTypedArray ,
order )로 설정합니다.
그 밖의 경우,
rawValue 를 리스트 로
설정하고, 각 요소는 block 의 byteIndex (포함)부터
byteIndex + elementSize (제외)까지의 인덱스에 있는 바이트입니다.
Assert :
rawValue 의 요소 개수는 elementSize 여야 합니다.
isLittleEndian 이 존재하지 않으면, isLittleEndian 을 주변
에이전트 의 에이전트 레코드 의 [[LittleEndian]] 값으로 설정합니다.
RawBytesToNumeric (type ,
rawValue , isLittleEndian )를 반환합니다.
25.1.3.17 NumericToRawBytes ( type , value ,
isLittleEndian )
추상 연산 NumericToRawBytes는 인자 type (TypedArray 요소 타입 ),
value (Number 또는 BigInt), isLittleEndian (Boolean)을 받고 리스트 of 바이트 값 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
type 이 float16 이면,
rawBytes 를 리스트 로
설정하고, 각 요소는 value 를 IEEE 754-2019
binary16 형식으로 roundTiesToEven 모드로 변환한 2 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다.
value 가 NaN 이면 rawBytes 는 구현체가 선택한
IEEE 754-2019 binary16 형식
NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을
선택해야 합니다.
그 밖의 경우 type 이 float32 이면,
rawBytes 를 리스트 로
설정하고, 각 요소는 value 를 IEEE 754-2019
binary32 형식으로 roundTiesToEven 모드로 변환한 4 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다.
value 가 NaN 이면 rawBytes 는 구현체가 선택한
IEEE 754-2019 binary32 형식
NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을
선택해야 합니다.
그 밖의 경우 type 이 float64 이면,
rawBytes 를 리스트 로
설정하고, 각 요소는 IEEE 754-2019 binary64 형식으로
value 를 인코딩한 8 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다. value 가
NaN 이면 rawBytes 는 구현체가 선택한 IEEE 754-2019 binary64 형식
NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을
선택해야 합니다.
그 밖의 경우,
n 을 표
75 의 Element Type type 에 지정된 Element Size
값으로 설정합니다.
conversionOperation 을 표 75 의
Element Type type 의 Conversion Operation 열에 명시된 추상 연산으로 설정합니다.
intValue 를 ℝ (!conversionOperation (value ))로
설정합니다.
intValue ≥ 0이면,
rawBytes 를 리스트 로
설정하고, 각 요소는 intValue 의 n 바이트 이진 인코딩입니다. 바이트는 리틀
엔디안 순서로 배열됩니다.
그 밖의 경우,
rawBytes 를 리스트 로
설정하고, 각 요소는 intValue 의 n 바이트 이진 2의 보수 인코딩입니다.
바이트는 리틀 엔디안 순서로 배열됩니다.
isLittleEndian 이 false 이면 rawBytes 의 요소 순서를
반대로 합니다.
rawBytes 를 반환합니다.
25.1.3.18 SetValueInBuffer ( arrayBuffer ,
byteIndex , type , value , isTypedArray ,
order [ , isLittleEndian ] )
추상 연산 SetValueInBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer),
byteIndex (0 이상의 정수 ),
type (TypedArray 요소 타입 ),
value (Number 또는 BigInt), isTypedArray (Boolean), order
(seq-cst , unordered ,
init ), 선택적 인자 isLittleEndian (Boolean)를 받고
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsDetachedBuffer (arrayBuffer )
가 false 임을 확인합니다.
Assert :
arrayBuffer 의 byteIndex 부터 type 값 표현에 충분한 바이트가 있어야
합니다.
Assert :
IsBigIntElementType (type )
가 true 이면 value 는 BigInt 이어야
하며, 아니면 value 는 Number 여야
한다는 점을 확인합니다.
block 을 arrayBuffer .[[ArrayBufferData]] 로 설정합니다.
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
isLittleEndian 이 존재하지 않으면, isLittleEndian 을 주변
에이전트 의 에이전트 레코드 의 [[LittleEndian]] 값으로 설정합니다.
rawBytes 를 NumericToRawBytes (type ,
value , isLittleEndian )로 설정합니다.
IsSharedArrayBuffer (arrayBuffer )
가 true 이면,
execution 을 주변 에이전트 의 에이전트
레코드 의 [[CandidateExecution]]
필드로 설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로
설정합니다.
isTypedArray 가 true 이고 IsNoTearConfiguration (type ,
order )가 true 이면 noTear 를
true 로, 아니면 false 로 설정합니다.
WriteSharedMemory
{ [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes }를
eventsRecord .[[EventList]] 에 추가합니다.
그 밖의 경우,
rawBytes 의 각 바이트를 block 에
block [byteIndex ]부터 저장합니다.
unused 를 반환합니다.
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer ,
byteIndex , type , value , op )
추상 연산 GetModifySetValueInBuffer는 인자 arrayBuffer (ArrayBuffer 또는
SharedArrayBuffer), byteIndex (0 이상의 정수 ),
type (TypedArray 요소 타입 ),
value (Number 또는 BigInt), op (read-modify-write 수정 함수 )를 받고 Number
또는 BigInt를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsDetachedBuffer (arrayBuffer )
가 false 임을 확인합니다.
Assert :
arrayBuffer 의 byteIndex 부터 type 값 표현에 충분한 바이트가 있어야
합니다.
Assert :
IsBigIntElementType (type )
가 true 이면 value 는 BigInt 이어야
하며, 아니면 value 는 Number 여야
한다는 점을 확인합니다.
block 을 arrayBuffer .[[ArrayBufferData]] 로 설정합니다.
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
isLittleEndian 을 주변 에이전트 의 에이전트
레코드 의 [[LittleEndian]] 값으로 설정합니다.
rawBytes 를 NumericToRawBytes (type ,
value , isLittleEndian )로 설정합니다.
IsSharedArrayBuffer (arrayBuffer )
가 true 이면,
execution 을 주변 에이전트 의 에이전트
레코드 의 [[CandidateExecution]]
필드로 설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로
설정합니다.
rawBytesRead 를 elementSize 길이의 리스트 로
설정하고, 각 요소는 비결정적으로 선택된 바이트 값 입니다.
참고: 구현에서는 rawBytesRead 는 하드웨어에서 load-link, load-exclusive 또는
read-modify-write 명령의 피연산자 결과입니다. 비결정성은 메모리 모델 의 약한
일관성 하드웨어의 관찰 가능한 동작을 설명하기 위한 의미론적 규정입니다.
rmwEvent 를 ReadModifyWriteSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes , [[ModifyOp]] : op }로 설정합니다.
rmwEvent 를 eventsRecord .[[EventList]] 에 추가합니다.
Chosen Value Record
{ [[Event]] : rmwEvent , [[ChosenValue]] : rawBytesRead }를
execution .[[ChosenValues]] 에 추가합니다.
그 밖의 경우,
rawBytesRead 를 elementSize 길이의 리스트 로
설정하고, 각 요소는 block [byteIndex ]부터 시작하는
elementSize 바이트입니다.
rawBytesModified 를 op (rawBytesRead ,
rawBytes )로 설정합니다.
rawBytesModified 의 각 바이트를 block 에
block [byteIndex ]부터 저장합니다.
RawBytesToNumeric (type ,
rawBytesRead , isLittleEndian )를 반환합니다.
25.1.4 ArrayBuffer 생성자
ArrayBuffer 생성자 :
%ArrayBuffer% 입니다.
글로벌
객체 의 "ArrayBuffer" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 ArrayBuffer를 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 ArrayBuffer 동작을 상속하려는 서브클래스 생성자 는
super 호출을 포함하여 ArrayBuffer 생성자 에 서브클래스 인스턴스가
ArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
25.1.4.1 ArrayBuffer ( length [ , options
] )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
byteLength 를 ? ToIndex (length )로 설정합니다.
requestedMaxByteLength 를 ? GetArrayBufferMaxByteLengthOption (options )로
설정합니다.
? AllocateArrayBuffer (NewTarget,
byteLength , requestedMaxByteLength )를 반환합니다.
25.1.5 ArrayBuffer 생성자의 속성
ArrayBuffer 생성자 :
25.1.5.1 ArrayBuffer.isView ( arg )
이 함수는 호출 시 다음 단계들을 수행합니다:
arg 가 객체가 아니면 false 를
반환합니다.
arg 가 [[ViewedArrayBuffer]] 내부 슬롯을 가지고 있으면
true 를 반환합니다.
false 를 반환합니다.
25.1.5.2 ArrayBuffer.prototype
ArrayBuffer.prototype의 초기 값은 ArrayBuffer 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
25.1.5.3 get ArrayBuffer [ %Symbol.species% ]
ArrayBuffer[%Symbol.species%]는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
참고
25.1.6 ArrayBuffer 프로토타입 객체의 속성
ArrayBuffer 프로토타입 객체 :
%ArrayBuffer.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[ArrayBufferData]] 또는 [[ArrayBufferByteLength]] 내부 슬롯을 가지지 않습니다.
25.1.6.1 get ArrayBuffer.prototype.byteLength
ArrayBuffer.prototype.byteLength는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
IsDetachedBuffer (O )
가 true 이면 +0 𝔽 를 반환합니다.
length 를 O .[[ArrayBufferByteLength]] 로
설정합니다.
𝔽 (length )를 반환합니다.
25.1.6.2 ArrayBuffer.prototype.constructor
ArrayBuffer.prototype.constructor의 초기 값은 %ArrayBuffer% 입니다.
25.1.6.3 get ArrayBuffer.prototype.detached
ArrayBuffer.prototype.detached는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
IsDetachedBuffer (O )를
반환합니다.
25.1.6.4 get ArrayBuffer.prototype.maxByteLength
ArrayBuffer.prototype.maxByteLength는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
IsDetachedBuffer (O )
가 true 이면 +0 𝔽 를 반환합니다.
IsFixedLengthArrayBuffer (O )
가 true 이면,
length 를 O .[[ArrayBufferByteLength]] 로 설정합니다.
그 밖의 경우,
length 를 O .[[ArrayBufferMaxByteLength]] 로 설정합니다.
𝔽 (length )를 반환합니다.
25.1.6.5 get ArrayBuffer.prototype.resizable
ArrayBuffer.prototype.resizable는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
IsFixedLengthArrayBuffer (O )
가 false 이면 true 를 반환하고, 그 밖의 경우
false 를 반환합니다.
25.1.6.6 ArrayBuffer.prototype.resize ( newLength )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferMaxByteLength]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
newByteLength 를 ? ToIndex (newLength )로 설정합니다.
IsDetachedBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
newByteLength > O .[[ArrayBufferMaxByteLength]] 이면 RangeError
예외를 throw합니다.
hostHandled 를 ? HostResizeArrayBuffer (O ,
newByteLength )로 설정합니다.
hostHandled 가 handled 이면
undefined 를 반환합니다.
oldBlock 을 O .[[ArrayBufferData]] 로
설정합니다.
newBlock 을 ? CreateByteDataBlock (newByteLength )로
설정합니다.
copyLength 를 min (newByteLength ,
O .[[ArrayBufferByteLength]] )로 설정합니다.
CopyDataBlockBytes (newBlock ,
0, oldBlock , 0, copyLength )를 수행합니다.
참고: 새로운 Data Block 생성이나 기존 Data
Block 에서의 복사는 관찰할 수 없습니다.
구현체는 이 메서드를 제자리(in-place) 확장 또는 축소로 구현할 수 있습니다.
O .[[ArrayBufferData]] 에 newBlock 을
설정합니다.
O .[[ArrayBufferByteLength]] 에
newByteLength 를 설정합니다.
undefined 를 반환합니다.
25.1.6.7 ArrayBuffer.prototype.slice ( start ,
end )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
IsDetachedBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
len 을 O .[[ArrayBufferByteLength]] 로
설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 first 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 first 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 first 를 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )으로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
newLen 을 max (final - first , 0)으로
설정합니다.
ctor 를 ? SpeciesConstructor (O ,
%ArrayBuffer% )로 설정합니다.
new 를 ? Construct (ctor , « 𝔽 (newLen ) »)로 설정합니다.
? RequireInternalSlot (new ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (new )
가 true 이면 TypeError 예외를 throw합니다.
IsDetachedBuffer (new )
가 true 이면 TypeError 예외를 throw합니다.
SameValue (new , O )
가 true 이면 TypeError 예외를 throw합니다.
new .[[ArrayBufferByteLength]] <
newLen 이면 TypeError 예외를 throw합니다.
참고: 위 단계의 부작용으로 O 가 detach 또는 resize 되었을 수 있습니다.
IsDetachedBuffer (O )
가 true 이면 TypeError 예외를 throw합니다.
fromBuf 를 O .[[ArrayBufferData]] 로
설정합니다.
toBuf 를 new .[[ArrayBufferData]] 로
설정합니다.
currentLen 을 O .[[ArrayBufferByteLength]] 로 설정합니다.
first < currentLen 이면,
count 를 min (newLen ,
currentLen - first )로 설정합니다.
CopyDataBlockBytes (toBuf ,
0, fromBuf , first , count )를 수행합니다.
new 를 반환합니다.
25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength
] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ArrayBufferCopyAndDetach (O ,
newLength , preserve-resizability )를 반환합니다.
25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [
newLength ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? ArrayBufferCopyAndDetach (O ,
newLength , fixed-length )를 반환합니다.
25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"ArrayBuffer" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
25.1.7 ArrayBuffer 인스턴스의 속성
ArrayBuffer 인스턴스는 ArrayBuffer
프로토타입 객체 로부터 프로퍼티를 상속받습니다. 각 ArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯, [[ArrayBufferByteLength]] 내부 슬롯, [[ArrayBufferDetachKey]] 내부 슬롯을 가집니다. 크기 조절 가능한 ArrayBuffer 인스턴스는 [[ArrayBufferMaxByteLength]] 내부 슬롯도 가집니다.
[[ArrayBufferData]] 가 null 인 ArrayBuffer 인스턴스는 detach된
것으로 간주되며, 해당 인스턴스의 데이터를 접근하거나 수정하는 모든 연산자는 실패합니다.
[[ArrayBufferDetachKey]] 가 undefined 이 아닌 값으로 설정된
ArrayBuffer 인스턴스는 DetachArrayBuffer 호출 시 동일한 "detach key"를
인수로 전달해야 하며, 그렇지 않으면 TypeError가 발생합니다. 이 내부 슬롯은 본 명세의 알고리즘이 아닌 특정 임베딩 환경에서만 설정됩니다.
25.1.8 크기 조절 가능한 ArrayBuffer 가이드라인
참고 1
다음은 크기 조절
가능한 ArrayBuffer 를 사용하는 ECMAScript 프로그래머를 위한 지침입니다.
가능하다면 프로그램을 실제 배포 환경에서 테스트할 것을 권장합니다. 사용 가능한 물리적 메모리의 양은 하드웨어 장치마다 크게 다릅니다. 가상 메모리 서브시스템
역시 하드웨어 및 운영 체제마다 매우 다릅니다. 64비트 데스크탑 웹 브라우저에서 메모리 부족 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는
메모리 부족 오류가 발생할 수 있습니다.
크기 조절 가능한
ArrayBuffer 의 "maxByteLength" 옵션 값을 선택할 때는,
애플리케이션에 필요한 최소 크기를 선택할 것을 권장합니다. "maxByteLength" 가 1,073,741,824
(230 바이트 또는 1GiB)를 초과하지 않도록 권장합니다.
특정 최대 크기로 크기 조절
가능한 ArrayBuffer 인스턴스를 성공적으로 생성했다고 해서 이후 크기 조절이 항상 성공한다는 보장은 없습니다.
참고 2
다음은 크기 조절
가능한 ArrayBuffer 를 구현하는 ECMAScript 구현자(엔진 개발자)를 위한 지침입니다.
크기 조절 가능한
ArrayBuffer 는 리사이즈 시 복사로 구현하거나, 가상 메모리를 미리 예약하여 제자리(in-place) 확장으로
구현하거나, 생성자 의 "maxByteLength" 옵션 값에
따라 두 방식을 혼합하여 구현할 수 있습니다.
호스트 가 다중 테넌트(여러
ECMAScript 애플리케이션을 동시에 실행) 환경(예: 웹 브라우저)이고, 가상 메모리를 미리 예약해서 제자리 확장 방식을 구현한다면, 32비트와 64비트
모두 "maxByteLength" ≥ 1GiB~1.5GiB 값에 대해 throw하도록 권장합니다. 이는 단일 애플리케이션이
가상 메모리 주소 공간을 고갈시키는 위험과 상호운용성 위험을 줄이기 위함입니다.
호스트 가 가상 메모리가 없는
경우(예: MMU 없는 임베디드 디바이스), 또는 복사로만 리사이즈를 구현하는 경우, "maxByteLength" 옵션에
대해 임의의 Number 값 을 허용할 수 있습니다. 하지만 요청한 크기의 메모리 블록을 절대 할당할 수 없는
경우에는 RangeError 를 throw할 것을 권장합니다. 예를 들어, 요청한 크기가 디바이스의 최대 사용 가능한
메모리보다 클 때입니다.
25.2 SharedArrayBuffer 객체
25.2.1 고정 길이 및 성장 가능한 SharedArrayBuffer 객체
고정 길이 SharedArrayBuffer 는 생성 후 바이트 길이가 변경될 수 없는 SharedArrayBuffer입니다.
성장 가능한 SharedArrayBuffer 는 SharedArrayBuffer.prototype.grow (
newLength ) 호출을 통해 생성 후 바이트 길이가 증가할 수 있는 SharedArrayBuffer입니다.
생성되는 SharedArrayBuffer 객체의 종류는 SharedArrayBuffer ( length
[ ,
options ] ) 에 전달되는 인자에 따라 결정됩니다.
25.2.2 SharedArrayBuffer 객체를 위한 추상 연산
25.2.2.1 AllocateSharedArrayBuffer ( constructor ,
byteLength [ , maxByteLength ] )
추상 연산 AllocateSharedArrayBuffer는 인자 constructor (생성자 ), byteLength (0 이상의
정수 ), 선택적 인자
maxByteLength (0 이상의 정수 또는 empty )를 받고, 정상 완료로
SharedArrayBuffer 또는 throw
완료 를 반환합니다. 이 연산은 SharedArrayBuffer를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:
slots 를 « [[ArrayBufferData]] »로 설정합니다.
maxByteLength 가 존재하며 maxByteLength 가
empty 가 아니면, allocatingGrowableBuffer 를
true 로, 그렇지 않으면 false 로 설정합니다.
allocatingGrowableBuffer 가 true 이면,
byteLength > maxByteLength 이면
RangeError 예외를 throw합니다.
[[ArrayBufferByteLengthData]] 와 [[ArrayBufferMaxByteLength]] 를 slots 에
추가합니다.
그 밖의 경우,
[[ArrayBufferByteLength]] 를 slots 에 추가합니다.
obj 를 ? OrdinaryCreateFromConstructor (constructor ,
"%SharedArrayBuffer.prototype%" , slots )로 설정합니다.
allocatingGrowableBuffer 가 true 이면
allocLength 를 maxByteLength 로, 아니면 byteLength 로 설정합니다.
block 을 ? CreateSharedByteDataBlock (allocLength )로
설정합니다.
obj .[[ArrayBufferData]] 에 block 을
설정합니다.
allocatingGrowableBuffer 가 true 이면,
Assert : byteLength ≤
maxByteLength 임을 확인합니다.
byteLengthBlock 을 ? CreateSharedByteDataBlock (8)로
설정합니다.
SetValueInBuffer (byteLengthBlock ,
0, biguint64 , ℤ (byteLength ),
true , seq-cst )를 수행합니다.
obj .[[ArrayBufferByteLengthData]] 에
byteLengthBlock 을 설정합니다.
obj .[[ArrayBufferMaxByteLength]] 에
maxByteLength 를 설정합니다.
그 밖의 경우,
obj .[[ArrayBufferByteLength]] 에
byteLength 를 설정합니다.
obj 를 반환합니다.
25.2.2.2 IsSharedArrayBuffer ( obj )
추상 연산 IsSharedArrayBuffer는 인자 obj (ArrayBuffer 또는 SharedArrayBuffer)를 받아 Boolean을
반환합니다. 이 연산은 객체가 ArrayBuffer, SharedArrayBuffer 또는 그 서브타입인지 테스트합니다. 호출 시 다음 단계들을 수행합니다:
bufferData 를 obj .[[ArrayBufferData]] 로
설정합니다.
bufferData 가 null 이면 false 를 반환합니다.
bufferData 가 Data Block 이면
false 를 반환합니다.
Assert :
bufferData 는 Shared Data Block 임을 확인합니다.
true 를 반환합니다.
25.2.2.3 HostGrowSharedArrayBuffer ( buffer ,
newByteLength )
호스트 정의
추상 연산 HostGrowSharedArrayBuffer는 인자 buffer (SharedArrayBuffer)와
newByteLength (0 이상의 정수 )를 받고, 정상 완료로
handled 또는
unhandled 또는 throw 완료 를 반환합니다. 이
연산은 호스트 가
구현 정의 방식으로 buffer 를 성장시킬 기회를
제공합니다. 호스트 가 성장 처리를 하지
않기로 선택하면, 기본 동작에 대해 unhandled 를 반환할 수 있습니다.
HostGrowSharedArrayBuffer의 구현은 다음 요구사항을 따라야 합니다:
추상 연산이 unhandled 로 정상 완료하지 않고, newByteLength 가
buffer 의 현재 바이트 길이보다 작거나 newByteLength 가 buffer .[[ArrayBufferMaxByteLength]] 보다 크면 RangeError
예외를 throw합니다.
isLittleEndian 을 주변 에이전트 의 에이전트 레코드 의 [[LittleEndian]] 값으로 설정합니다. 추상 연산이
handled 로 정상 완료되면, WriteSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트가 추가되어야 하며, [[Order]] 는 seq-cst , [[Payload]] 는 NumericToRawBytes (biguint64 ,
newByteLength , isLittleEndian ), [[Block]]
는 buffer .[[ArrayBufferByteLengthData]] , [[ByteIndex]] 는 0, 그리고 [[ElementSize]]
는 8이어야 하며, 주변 에이전트 의 candidate execution 에 추가되어야 하며,
경쟁적으로 호출된 SharedArrayBuffer.prototype.grow가 "손실"되지 않도록 해야 합니다.
참고
위 두 번째 요구사항은 buffer 의 현재 바이트 길이를 언제 어떻게 읽는지에 대해 의도적으로 모호하게 작성되어 있습니다. 바이트
길이는 하드웨어에서 원자적 read-modify-write 연산을 통해 갱신되어야 하므로, load-link/store-conditional 또는
load-exclusive/store-exclusive 명령 쌍을 사용하는 아키텍처는 해당 명령을 명령 스트림 내에서 가깝게 유지할 수 있습니다.
따라서 SharedArrayBuffer.prototype.grow 자체는 newByteLength 에 대해 경계 검사를 수행하지
않으며, 현재 바이트 길이를 언제 읽는지에 대한 요구사항도 없습니다.
이는 HostResizeArrayBuffer 와는
대조적인데, 이 연산은 newByteLength 값이 ≥ 0이고 buffer .[[ArrayBufferMaxByteLength]] ≤ 값임을 보장합니다.
HostGrowSharedArrayBuffer의 기본 구현은 NormalCompletion (unhandled )를
반환하는 것입니다.
25.2.3 SharedArrayBuffer 생성자
SharedArrayBuffer 생성자 :
%SharedArrayBuffer% 입니다.
글로벌
객체 의 "SharedArrayBuffer" 프로퍼티의 초기 값입니다(해당 프로퍼티가
존재하는 경우, 아래 참조).
생성자 로 호출될
때 새로운 SharedArrayBuffer를 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 SharedArrayBuffer 동작을 상속하려는 서브클래스
생성자 는
super 호출을 포함하여 SharedArrayBuffer 생성자 에 서브클래스 인스턴스가
SharedArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
호스트 가 SharedArrayBuffer에 대한
동시 접근을 제공하지 않는 경우, 글로벌 객체 에서 "SharedArrayBuffer"
프로퍼티를 생략할 수 있습니다.
참고
ArrayBuffer와 달리 SharedArrayBuffer는 detach될 수 없으며, 내부 [[ArrayBufferData]] 슬롯이 null 이 되는 일이 없습니다.
25.2.3.1 SharedArrayBuffer ( length [ ,
options ] )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
byteLength 를 ? ToIndex (length )로 설정합니다.
requestedMaxByteLength 를 ? GetArrayBufferMaxByteLengthOption (options )로
설정합니다.
? AllocateSharedArrayBuffer (NewTarget,
byteLength , requestedMaxByteLength )를 반환합니다.
25.2.4 SharedArrayBuffer 생성자의 속성
SharedArrayBuffer 생성자 :
25.2.4.1 SharedArrayBuffer.prototype
SharedArrayBuffer.prototype의 초기 값은 SharedArrayBuffer
프로토타입 객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]
SharedArrayBuffer[%Symbol.species%]는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
25.2.5 SharedArrayBuffer 프로토타입 객체의 속성
SharedArrayBuffer 프로토타입 객체 :
%SharedArrayBuffer.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[ArrayBufferData]] 또는 [[ArrayBufferByteLength]] 내부 슬롯을 가지지 않습니다.
25.2.5.1 get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLength는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 false 이면 TypeError 예외를 throw합니다.
length 를 ArrayBufferByteLength (O ,
seq-cst )로 설정합니다.
𝔽 (length )를 반환합니다.
25.2.5.2 SharedArrayBuffer.prototype.constructor
SharedArrayBuffer.prototype.constructor의 초기 값은 %SharedArrayBuffer% 입니다.
25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength
)
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferMaxByteLength]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 false 이면 TypeError 예외를 throw합니다.
newByteLength 를 ? ToIndex (newLength )로 설정합니다.
hostHandled 를 ? HostGrowSharedArrayBuffer (O ,
newByteLength )로 설정합니다.
hostHandled 가 handled 이면
undefined 를 반환합니다.
isLittleEndian 을 주변 에이전트 의 에이전트
레코드 의 [[LittleEndian]] 값으로 설정합니다.
byteLengthBlock 을 O .[[ArrayBufferByteLengthData]] 로 설정합니다.
currentByteLengthRawBytes 를 GetRawBytesFromSharedBlock (byteLengthBlock ,
0, biguint64 , true ,
seq-cst )로 설정합니다.
newByteLengthRawBytes 를 NumericToRawBytes (biguint64 ,
ℤ (newByteLength ),
isLittleEndian )로 설정합니다.
반복합니다,
참고: 이 루프는 동일 버퍼에 대해 병렬적으로 경쟁적으로 grow하는 경우를 완전히 순서화하고, 손실되지 않으며, 조용히 아무것도 하지
않는 일이 없도록 하기 위한 compare-and-exchange 루프입니다. 경쟁이 없는 경우 grow 시도를 할 수 있으면 반복을
종료합니다.
currentByteLength 를 ℝ (RawBytesToNumeric (biguint64 ,
currentByteLengthRawBytes , isLittleEndian ))로 설정합니다.
newByteLength = currentByteLength 이면
undefined 를 반환합니다.
newByteLength < currentByteLength 또는
newByteLength > O .[[ArrayBufferMaxByteLength]] 이면
RangeError 예외를 throw합니다.
byteLengthDelta 를 newByteLength -
currentByteLength 로 설정합니다.
byteLengthDelta 바이트로 구성된 Shared Data
Block 값을 생성할 수 없으면 RangeError 예외를
throw합니다.
참고: 여기서는 새로운 Shared Data Block 를 생성 및 사용하지
않습니다. growable SharedArrayBuffer의 관찰 가능한 동작은 생성 시 max 크기의 Shared Data Block 를 할당하도록
명세되며, 이 단계는 구현체가 메모리 부족이면 RangeError 를 throw해야 한다는 요구사항을
담고 있습니다.
readByteLengthRawBytes 를 AtomicCompareExchangeInSharedBlock (byteLengthBlock ,
0, 8, currentByteLengthRawBytes ,
newByteLengthRawBytes )로 설정합니다.
ByteListEqual (readByteLengthRawBytes ,
currentByteLengthRawBytes )가 true 이면
undefined 를 반환합니다.
currentByteLengthRawBytes 를
readByteLengthRawBytes 로 설정합니다.
참고
길이 갱신을 위한 compare-exchange의 허위 실패는 금지됩니다. 새로운 길이에 대한 경계 검사가 통과되고 구현체가 메모리 부족이 아니라면,
ReadModifyWriteSharedMemory
이벤트(즉, 성공적인 compare-exchange)가 항상 candidate
execution 에 추가됩니다.
SharedArrayBuffer.prototype.grow의 병렬 호출은 완전히 순서화됩니다. 예를 들어, 두 개의 경쟁 호출
sab.grow(10)과 sab.grow(20)이 있을 때, 두 호출 중 하나는 반드시 경쟁에서
승리합니다. sab.grow(10) 호출은 sab.grow(20)이 먼저 발생한 경우에도
sab를 축소하지 않으며, 대신 RangeError를 throw합니다.
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 false 이면 TypeError 예외를 throw합니다.
IsFixedLengthArrayBuffer (O )
가 false 이면 true 를 반환하고, 그 밖의 경우
false 를 반환합니다.
25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength
SharedArrayBuffer.prototype.maxByteLength는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 false 이면 TypeError 예외를 throw합니다.
IsFixedLengthArrayBuffer (O )
가 true 이면,
length 를 O .[[ArrayBufferByteLength]] 로 설정합니다.
그 밖의 경우,
length 를 O .[[ArrayBufferMaxByteLength]] 로 설정합니다.
𝔽 (length )를 반환합니다.
25.2.5.6 SharedArrayBuffer.prototype.slice ( start ,
end )
이 메서드는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (O )
가 false 이면 TypeError 예외를 throw합니다.
len 을 ArrayBufferByteLength (O ,
seq-cst )로 설정합니다.
relativeStart 를 ? ToIntegerOrInfinity (start )로
설정합니다.
relativeStart = -∞이면 first 를 0으로 설정합니다.
그 밖의 경우 relativeStart < 0이면 first 를 max (len
+ relativeStart , 0)으로 설정합니다.
그 밖의 경우 first 를 min (relativeStart ,
len )으로 설정합니다.
end 이 undefined 이면 relativeEnd 를
len 으로, 아니면 relativeEnd 를 ? ToIntegerOrInfinity (end )으로
설정합니다.
relativeEnd = -∞이면 final 을 0으로 설정합니다.
그 밖의 경우 relativeEnd < 0이면 final 을 max (len +
relativeEnd , 0)으로 설정합니다.
그 밖의 경우 final 을 min (relativeEnd , len )으로
설정합니다.
newLen 을 max (final - first , 0)으로
설정합니다.
ctor 를 ? SpeciesConstructor (O ,
%SharedArrayBuffer% )로
설정합니다.
new 를 ? Construct (ctor , « 𝔽 (newLen ) »)로 설정합니다.
? RequireInternalSlot (new ,
[[ArrayBufferData]] )를 수행합니다.
IsSharedArrayBuffer (new )
가 false 이면 TypeError 예외를 throw합니다.
new .[[ArrayBufferData]] 가 O .[[ArrayBufferData]] 와 같으면 TypeError
예외를 throw합니다.
ArrayBufferByteLength (new ,
seq-cst ) < newLen 이면
TypeError 예외를 throw합니다.
fromBuf 를 O .[[ArrayBufferData]] 로
설정합니다.
toBuf 를 new .[[ArrayBufferData]] 로
설정합니다.
CopyDataBlockBytes (toBuf ,
0, fromBuf , first , newLen )를 수행합니다.
new 를 반환합니다.
25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"SharedArrayBuffer" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
25.2.6 SharedArrayBuffer 인스턴스의 속성
SharedArrayBuffer 인스턴스는 SharedArrayBuffer 프로토타입
객체 로부터 프로퍼티를 상속받습니다. 각 SharedArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯을 가집니다. 성장 불가능한 SharedArrayBuffer 인스턴스는 [[ArrayBufferByteLength]] 내부 슬롯을 가집니다. 성장 가능한 인스턴스는 [[ArrayBufferByteLengthData]] 및 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가집니다.
참고
SharedArrayBuffer 인스턴스는 ArrayBuffer 인스턴스와 달리 detach되지 않습니다.
25.2.7 확장 가능한 SharedArrayBuffer 가이드라인
참고 1
다음은 확장 가능한
SharedArrayBuffer 를 사용하는 ECMAScript 프로그래머를 위한 지침입니다.
가능하다면 프로그램을 실제 배포 환경에서 테스트할 것을 권장합니다. 사용 가능한 물리적 메모리의 양은 하드웨어 장치마다 크게 다릅니다. 가상 메모리 서브시스템
역시 하드웨어 및 운영 체제마다 매우 다릅니다. 64비트 데스크탑 웹 브라우저에서 메모리 부족 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는
메모리 부족 오류가 발생할 수 있습니다.
확장 가능한
SharedArrayBuffer 의 "maxByteLength" 옵션 값을 선택할
때는, 애플리케이션에 필요한 최소 크기를 선택할 것을 권장합니다. "maxByteLength" 가 1073741824
(1GiB)를 초과하지 않도록 권장합니다.
특정 최대 크기로 확장 가능한
SharedArrayBuffer 인스턴스를 성공적으로 생성했다고 해서 이후 확장이 항상 성공한다는 보장은 없습니다.
확장 가능한
SharedArrayBuffer 의 길이(length)를 읽는 모든 연산이 동기화
seq-cst 로드인 것은 아닙니다. 정수 인덱스 프로퍼티 접근(예:
u8[idx])의 경계 검사에 사용되는 길이 읽기는 동기화되지 않습니다. 일반적으로 명시적 동기화가 없는 경우 한 번의 프로퍼티 접근이
경계 내(in-bound)라는 사실이 이후 동일 에이전트 의 프로퍼티 접근도 경계 내임을 의미하지 않습니다. 반면,
SharedArrayBuffer의 length 및 byteLength getter, %TypedArray% .prototype
및 DataView.prototype에서 명시적으로 길이를 읽는 연산은 동기화됩니다. 내장 메서드가 TypedArray 가 완전히 경계
밖(out-of-bounds)인지 확인하는 데 수행하는 길이 읽기도 동기화됩니다.
참고 2
다음은 확장 가능한
SharedArrayBuffer 를 구현하는 ECMAScript 구현자(엔진 개발자)를 위한 지침입니다.
확장 가능한
SharedArrayBuffer 는 가상 메모리를 미리 예약하여 제자리(in-place) 확장 방식으로 구현할 것을
권장합니다.
확장 연산은 확장 가능한
SharedArrayBuffer 에서 메모리 접근과 병렬로 발생할 수 있으므로, 메모리
모델 의 제약에 따라 unordered 접근도 "tear"되지 않아야 합니다(값의 비트가 뒤섞이지 않음). 실제로 이는
확장 가능한
SharedArrayBuffer 의 기반 데이터 블록을 복사로 확장할 수 없음을 의미합니다. 복사로 확장하려면 세계
정지를(stop-the-world) 해야 하며, 이는 직렬화 지점을 도입해 느려지므로 권장하지 않습니다.
확장된 메모리는 생성 순간부터 모든 경쟁적(racy) 병렬 접근에서도 0으로 채워진 상태로 보여야 합니다. 이는 필요 시 0으로 채워지는 가상 메모리 페이지를
사용하거나, 메모리를 직접 0으로 채울 경우 철저한 동기화를 통해 달성할 수 있습니다.
정수
인덱스 프로퍼티 접근 시 TypedArray 뷰를 통한 확장 가능한 SharedArrayBuffer는,
TypedArray 뷰의 비확장 SharedArrayBuffer 접근과 유사하게
최적화될 수 있도록 설계되었습니다. 이는 정수 인덱스 프로퍼티 로드가 기반 버퍼의 길이에 대해 동기화되지 않기
때문입니다(위 프로그래머 지침 참조). 예를 들어, 프로퍼티 접근에 대한 경계 검사가 여전히 루프 바깥으로 이동(hoist)될 수 있습니다.
실제로 가상 메모리가 없는 호스트 (예: MMU 없는 임베디드 디바이스)에서 확장 가능한
SharedArrayBuffer 를 복사로 구현하는 것은 어렵습니다. 이런 호스트 에서 확장 가능한 SharedArrayBuffer의 메모리
사용 동작은 가상 메모리가 있는 호스트 와 크게 다를 수 있습니다. 이런 호스트 는 사용자에게 메모리 사용 기대치를 명확하게 안내해야 합니다.
25.3 DataView 객체
25.3.1 DataView 객체를 위한 추상 연산
25.3.1.1 버퍼 위트니스 레코드를 가진 DataView
버퍼 위트니스 레코드를 가진
DataView 는 Record
값으로, DataView와 함께 뷰잉하는 버퍼의 바이트 길이 캐시를 캡슐화합니다. 이는 뷰잉하는 버퍼가 확장 가능한 SharedArrayBuffer일 때 바이트 길이
데이터 블록에 대해 단일 공유 메모리 읽기 이벤트가 있도록 돕기 위해 사용됩니다.
버퍼 위트니스 레코드를 가진 DataView는 표
77 에 나열된 필드를 가집니다.
표 77: 버퍼 위트니스 레코드를
가진 DataView 의 필드
필드 이름
값
의미
[[Object]]
DataView
바이트 길이가 로드된 DataView 객체
[[CachedBufferByteLength]]
0 이상의 정수 또는
detached
Record 가
생성될 때 객체의 [[ViewedArrayBuffer]] 의 바이트 길이
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj ,
order )
추상 연산 MakeDataViewWithBufferWitnessRecord는 인자 obj (DataView)와 order
(seq-cst 또는
unordered )를 받고, 버퍼 위트니스 레코드를 가진
DataView 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
buffer 를 obj .[[ViewedArrayBuffer]] 로
설정합니다.
IsDetachedBuffer (buffer )
가 true 이면,
byteLength 를 detached 로 설정합니다.
그 밖의 경우,
byteLength 를 ArrayBufferByteLength (buffer ,
order )로 설정합니다.
버퍼 위트니스 레코드를 가진
DataView { [[Object]] :
obj , [[CachedBufferByteLength]] :
byteLength }를 반환합니다.
25.3.1.3 GetViewByteLength ( viewRecord )
추상 연산 GetViewByteLength는 인자 viewRecord (버퍼 위트니스 레코드를 가진
DataView )를 받아 0 이상의 정수 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
IsViewOutOfBounds (viewRecord )
가 false 임을 확인합니다.
view 를 viewRecord .[[Object]] 로 설정합니다.
view .[[ByteLength]] 가
auto 가 아니면 view .[[ByteLength]] 를 반환합니다.
Assert :
IsFixedLengthArrayBuffer (view .[[ViewedArrayBuffer]] )가 false 임을 확인합니다.
byteOffset 을 view .[[ByteOffset]] 로
설정합니다.
byteLength 를 viewRecord .[[CachedBufferByteLength]] 로 설정합니다.
Assert :
byteLength 가 detached 가 아님을 확인합니다.
byteLength - byteOffset 을 반환합니다.
25.3.1.4 IsViewOutOfBounds ( viewRecord )
추상 연산 IsViewOutOfBounds는 인자 viewRecord (버퍼 위트니스 레코드를 가진
DataView )를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:
view 를 viewRecord .[[Object]] 로 설정합니다.
bufferByteLength 를 viewRecord .[[CachedBufferByteLength]] 로 설정합니다.
Assert :
IsDetachedBuffer (view .[[ViewedArrayBuffer]] )가 true 인 경우와
bufferByteLength 가 detached 인 경우가 반드시 일치함을 확인합니다.
bufferByteLength 가 detached 이면
true 를 반환합니다.
byteOffsetStart 를 view .[[ByteOffset]] 로
설정합니다.
view .[[ByteLength]] 가
auto 이면,
byteOffsetEnd 를 bufferByteLength 로 설정합니다.
그 밖의 경우,
byteOffsetEnd 를 byteOffsetStart +
view .[[ByteLength]] 로 설정합니다.
byteOffsetStart > bufferByteLength 또는
byteOffsetEnd > bufferByteLength 이면 true 를
반환합니다.
참고: 길이가 0인 DataView는 out-of-bounds로 간주되지 않습니다.
false 를 반환합니다.
25.3.1.5 GetViewValue ( view ,
requestIndex , isLittleEndian , type )
추상 연산 GetViewValue는 인자 view (ECMAScript 언어
값 ),
requestIndex (ECMAScript 언어 값 ),
isLittleEndian (ECMAScript 언어
값 ), type (TypedArray 요소 타입 )를 받고,
정상 완료로 Number 또는
BigInt, 또는 throw 완료 를 반환합니다.
DataView 인스턴스 함수가 뷰의 버퍼에서 값을 가져올 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (view ,
[[DataView]] )를 수행합니다.
Assert :
view 가 [[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
getIndex 를 ? ToIndex (requestIndex )로 설정합니다.
isLittleEndian 을 ToBoolean (isLittleEndian )로
설정합니다.
viewOffset 을 view .[[ByteOffset]] 로
설정합니다.
viewRecord 를 MakeDataViewWithBufferWitnessRecord (view ,
unordered )로 설정합니다.
참고: view 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때 경계 검사는 동기화 연산이 아닙니다.
IsViewOutOfBounds (viewRecord )
가 true 이면 TypeError 예외를 throw합니다.
viewSize 를 GetViewByteLength (viewRecord )로
설정합니다.
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
getIndex + elementSize > viewSize 이면
RangeError 예외를 throw합니다.
bufferIndex 를 getIndex + viewOffset 로 설정합니다.
GetValueFromBuffer (view .[[ViewedArrayBuffer]] , bufferIndex ,
type , false , unordered ,
isLittleEndian )를 반환합니다.
25.3.1.6 SetViewValue ( view ,
requestIndex , isLittleEndian , type , value )
추상 연산 SetViewValue는 인자 view (ECMAScript 언어
값 ),
requestIndex (ECMAScript 언어 값 ),
isLittleEndian (ECMAScript 언어
값 ), type (TypedArray 요소 타입 ),
value (ECMAScript 언어 값 )를 받고, 정상 완료로
undefined 또는 throw
완료 를 반환합니다. DataView 인스턴스 함수가 뷰의 버퍼에 값을 저장할 때 사용됩니다. 호출 시 다음 단계들을
수행합니다:
? RequireInternalSlot (view ,
[[DataView]] )를 수행합니다.
Assert :
view 가 [[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
getIndex 를 ? ToIndex (requestIndex )로 설정합니다.
IsBigIntElementType (type )
가 true 이면 numberValue 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우, numberValue 를 ? ToNumber (value )로 설정합니다.
isLittleEndian 을 ToBoolean (isLittleEndian )로
설정합니다.
viewOffset 을 view .[[ByteOffset]] 로
설정합니다.
viewRecord 를 MakeDataViewWithBufferWitnessRecord (view ,
unordered )로 설정합니다.
참고: view 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때 경계 검사는 동기화 연산이 아닙니다.
IsViewOutOfBounds (viewRecord )
가 true 이면 TypeError 예외를 throw합니다.
viewSize 를 GetViewByteLength (viewRecord )로
설정합니다.
elementSize 를 표 75 의
Element Type type 에 지정된 Element Size 값으로 설정합니다.
getIndex + elementSize > viewSize 이면
RangeError 예외를 throw합니다.
bufferIndex 를 getIndex + viewOffset 로 설정합니다.
SetValueInBuffer (view .[[ViewedArrayBuffer]] , bufferIndex ,
type , numberValue , false ,
unordered , isLittleEndian )를 수행합니다.
undefined 를 반환합니다.
25.3.2 DataView 생성자
DataView 생성자 :
%DataView% 입니다.
글로벌
객체 의 "DataView" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 DataView를 생성하고 초기화합니다.
함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 DataView 동작을 상속하려는 서브클래스 생성자 는
super 호출을 포함하여 DataView 생성자 에 서브클래스 인스턴스가 DataView.prototype
내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.
25.3.2.1 DataView ( buffer [ , byteOffset
[ , byteLength ] ] )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
? RequireInternalSlot (buffer ,
[[ArrayBufferData]] )를 수행합니다.
offset 을 ? ToIndex (byteOffset )로 설정합니다.
IsDetachedBuffer (buffer )
가 true 이면 TypeError 예외를 throw합니다.
bufferByteLength 를 ArrayBufferByteLength (buffer ,
seq-cst )로 설정합니다.
offset > bufferByteLength 이면 RangeError
예외를 throw합니다.
bufferIsFixedLength 를 IsFixedLengthArrayBuffer (buffer )로
설정합니다.
byteLength 가 undefined 이면,
bufferIsFixedLength 가 true 이면,
viewByteLength 를 bufferByteLength -
offset 으로 설정합니다.
그 밖의 경우,
viewByteLength 를 auto 로 설정합니다.
그 밖의 경우,
viewByteLength 를 ? ToIndex (byteLength )로
설정합니다.
offset + viewByteLength >
bufferByteLength 이면 RangeError 예외를 throw합니다.
O 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%DataView.prototype%" , « [[DataView]] ,
[[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] »)로 설정합니다.
IsDetachedBuffer (buffer )
가 true 이면 TypeError 예외를 throw합니다.
bufferByteLength 를 ArrayBufferByteLength (buffer ,
seq-cst )로 다시 설정합니다.
offset > bufferByteLength 이면 RangeError
예외를 throw합니다.
byteLength 가 undefined 가 아니면,
offset + viewByteLength >
bufferByteLength 이면 RangeError 예외를 throw합니다.
O .[[ViewedArrayBuffer]] 에 buffer 를
설정합니다.
O .[[ByteLength]] 에 viewByteLength 를
설정합니다.
O .[[ByteOffset]] 에 offset 을 설정합니다.
O 를 반환합니다.
25.3.3 DataView 생성자의 속성
DataView 생성자 :
25.3.3.1 DataView.prototype
DataView.prototype의 초기 값은 DataView 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
25.3.4 DataView 프로토타입 객체의 속성
DataView 프로토타입 객체 :
%DataView.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] 내부 슬롯을 가지지
않습니다.
25.3.4.1 get DataView.prototype.buffer
DataView.prototype.buffer는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[DataView]] )를 수행합니다.
Assert :
O 가 [[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
buffer 를 O .[[ViewedArrayBuffer]] 로
설정합니다.
buffer 를 반환합니다.
25.3.4.2 get DataView.prototype.byteLength
DataView.prototype.byteLength는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[DataView]] )를 수행합니다.
Assert :
O 가 [[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
viewRecord 를 MakeDataViewWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsViewOutOfBounds (viewRecord )
가 true 이면 TypeError 예외를 throw합니다.
size 를 GetViewByteLength (viewRecord )로
설정합니다.
𝔽 (size )를 반환합니다.
25.3.4.3 get DataView.prototype.byteOffset
DataView.prototype.byteOffset는 접근자 프로퍼티 이며 set 접근자 함수는
undefined 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
O 를 this 값으로 설정합니다.
? RequireInternalSlot (O ,
[[DataView]] )를 수행합니다.
Assert :
O 는 [[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
viewRecord 를 MakeDataViewWithBufferWitnessRecord (O ,
seq-cst )로 설정합니다.
IsViewOutOfBounds (viewRecord )
가 true 이면 TypeError 예외를 throw합니다.
offset 을 O .[[ByteOffset]] 로 설정합니다.
𝔽 (offset )을 반환합니다.
25.3.4.4 DataView.prototype.constructor
DataView.prototype.constructor의 초기 값은 %DataView% 입니다.
25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset
[ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , bigint64 )를
반환합니다.
25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset
[ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , biguint64 )를
반환합니다.
25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , float16 )를
반환합니다.
25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , float32 )를
반환합니다.
25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , float64 )를
반환합니다.
25.3.4.10 DataView.prototype.getInt8 ( byteOffset )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? GetViewValue (view ,
byteOffset , true , int8 )를 반환합니다.
25.3.4.11 DataView.prototype.getInt16 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , int16 )를
반환합니다.
25.3.4.12 DataView.prototype.getInt32 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , int32 )를
반환합니다.
25.3.4.13 DataView.prototype.getUint8 ( byteOffset )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? GetViewValue (view ,
byteOffset , true , uint8 )를
반환합니다.
25.3.4.14 DataView.prototype.getUint16 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , uint16 )를
반환합니다.
25.3.4.15 DataView.prototype.getUint32 ( byteOffset [
, littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? GetViewValue (view ,
byteOffset , littleEndian , uint32 )를
반환합니다.
25.3.4.16 DataView.prototype.setBigInt64 (
byteOffset , value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , bigint64 ,
value )를 반환합니다.
25.3.4.17 DataView.prototype.setBigUint64 (
byteOffset , value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , biguint64 ,
value )를 반환합니다.
25.3.4.18 DataView.prototype.setFloat16 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , float16 ,
value )를 반환합니다.
25.3.4.19 DataView.prototype.setFloat32 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , float32 ,
value )를 반환합니다.
25.3.4.20 DataView.prototype.setFloat64 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , float64 ,
value )를 반환합니다.
25.3.4.21 DataView.prototype.setInt8 ( byteOffset ,
value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? SetViewValue (view ,
byteOffset , true , int8 ,
value )를 반환합니다.
25.3.4.22 DataView.prototype.setInt16 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , int16 ,
value )를 반환합니다.
25.3.4.23 DataView.prototype.setInt32 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , int32 ,
value )를 반환합니다.
25.3.4.24 DataView.prototype.setUint8 ( byteOffset ,
value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
? SetViewValue (view ,
byteOffset , true , uint8 ,
value )를 반환합니다.
25.3.4.25 DataView.prototype.setUint16 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , uint16 ,
value )를 반환합니다.
25.3.4.26 DataView.prototype.setUint32 ( byteOffset ,
value [ , littleEndian ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
view 를 this 값으로 설정합니다.
littleEndian 이 존재하지 않으면 littleEndian 을 false 로
설정합니다.
? SetViewValue (view ,
byteOffset , littleEndian , uint32 ,
value )를 반환합니다.
25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"DataView" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
25.3.5 DataView 인스턴스의 속성
DataView 인스턴스는 일반
객체 이며,
DataView 프로토타입
객체 로부터 프로퍼티를 상속받습니다. 각 DataView 인스턴스는 [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] 내부 슬롯을 가집니다.
참고
[[DataView]] 내부 슬롯의 값은 이 명세 내에서는 사용되지 않습니다. 내부 슬롯의 존재 자체로
DataView 생성자 로 생성된 객체임을 식별합니다.
25.4 Atomics 객체
Atomics 객체:
%Atomics% 입니다.
글로벌
객체 의 "Atomics" 프로퍼티의 초기 값입니다.
일반
객체 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
[[Construct]] 내부 메서드를 가지지 않으므로 new 연산자로 생성자 로 사용할 수 없습니다.
[[Call]] 내부 메서드를 가지지 않으므로 함수로 호출할 수 없습니다.
Atomics 객체는 공유 메모리 배열 셀에 대해 불가분적(원자적으로) 동작하는 함수와 에이전트 가 원시 이벤트를 대기 및 전달할 수 있는 함수를 제공합니다. 규율 있게 사용하면, Atomics 함수는
공유 메모리를 통해 통신하는 다중 에이전트
프로그램이 병렬 CPU에서도 잘 이해되는 순서로 실행될 수 있게 해줍니다. 공유 메모리 통신을 지배하는 규칙은 아래에 정의된 메모리 모델 에서
제공합니다.
참고
ECMAScript에서 공유 메모리 프로그래밍 및 구현에 관한 안내는 메모리 모델 섹션 끝의 참고를 참조하십시오.
25.4.1 Waiter Record
Waiter Record 는 Record 값으로,
Atomics.wait 또는 Atomics.waitAsync의 특정 호출을 나타내는 데 사용됩니다.
Waiter Record는 표
78 에 나열된 필드를 가집니다.
표 78: Waiter Record 필드
필드 이름
값
의미
[[AgentSignifier]]
에이전트
식별자
Atomics.wait 또는 Atomics.waitAsync를 호출한 에이전트 입니다.
[[PromiseCapability]]
PromiseCapability
Record 또는 blocking
Atomics.waitAsync 호출을 나타낼 경우 생성된 promise, 그렇지 않으면
blocking 입니다.
[[TimeoutTime]]
0 이상의 확장 수학적 값
타임아웃이 트리거될 수 있는 가장 이른 시간; 시간
값 을 사용해 계산됩니다.
[[Result]]
"ok" 또는 "timed-out"
호출의 반환 값입니다.
25.4.2 WaiterList Record
WaiterList Record 는 에이전트 가 Atomics.wait,
Atomics.waitAsync, Atomics.notify를 통해 대기 및 알림을 설명하는 데 사용됩니다.
WaiterList Record는 표 79 에 나열된 필드를 가집니다.
표 79: WaiterList Record 필드
WaiterList에는 동일한 에이전트
식별자 를 가진 Waiter Record 가 여러 개 있을 수 있습니다.
에이전트
클러스터 는 WaiterList Record의 저장소를 가지며, 저장소는 (block , i )로
인덱스됩니다. 여기서 block 은 공유 데이터 블록 이고, i 는 block 메모리의
바이트 오프셋입니다. WaiterList Record는 에이전트 에 독립적입니다: (block , i )로 저장소를 조회하면,
에이전트
클러스터 내 모든 에이전트 에서 동일한 WaiterList Record를 얻게 됩니다.
각 WaiterList Record는 평가 시 해당 WaiterList Record에 대한 배타적 접근을 제어하는 critical section 을 가집니다. 한 번에 하나의 에이전트 만 WaiterList Record의 critical section에
진입할 수 있습니다. 진입 및 이탈은 추상
연산 EnterCriticalSection 및 LeaveCriticalSection 으로 제어됩니다. WaiterList
Record에 대한 연산—대기 중인 에이전트
추가/제거, 에이전트 리스트 순회, 리스트의
에이전트 일시중지/알림, Synchronize 이벤트 설정/조회—는 WaiterList
Record의 critical section에 진입한 에이전트 만 수행할 수 있습니다.
25.4.3 Atomics를 위한 추상 연산
25.4.3.1 ValidateIntegerTypedArray ( typedArray ,
waitable )
추상 연산 ValidateIntegerTypedArray는 인자 typedArray (ECMAScript 언어 값 )와
waitable (Boolean)을 받아, 정상 완료(completion) 로
TypedArray With Buffer Witness
Record 를 반환하거나, throw completion 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
taRecord 를 ? ValidateTypedArray (typedArray ,
unordered )로 설정합니다.
참고: typedArray 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때, 경계 검사는 동기화(synchronizing) 연산이 아닙니다.
waitable 이 true 이면,
typedArray .[[TypedArrayName]] 이
"Int32Array" 도 아니고 "BigInt64Array" 도 아니면
TypeError 예외를 throw합니다.
그 밖의 경우,
type 을 TypedArrayElementType (typedArray )로
설정합니다.
IsUnclampedIntegerElementType (type )
이 false 이고, IsBigIntElementType (type )
이 false 이면 TypeError 예외를 throw합니다.
taRecord 를 반환합니다.
25.4.3.2 ValidateAtomicAccess ( taRecord ,
requestIndex )
추상 연산 ValidateAtomicAccess는 인자 taRecord (TypedArray With Buffer Witness
Record )와 requestIndex (ECMAScript 언어 값 )를 받아, 정상 완료(completion) 로
정수 를 반환하거나,
throw completion 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
length 를 TypedArrayLength (taRecord )로
설정합니다.
accessIndex 를 ? ToIndex (requestIndex )로 설정합니다.
Assert :
accessIndex ≥ 0임을 확인합니다.
accessIndex ≥ length 이면 RangeError 예외를
throw합니다.
typedArray 를 taRecord .[[Object]] 로
설정합니다.
elementSize 를 TypedArrayElementSize (typedArray )로
설정합니다.
offset 을 typedArray .[[ByteOffset]] 로
설정합니다.
(accessIndex × elementSize ) + offset 을 반환합니다.
25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray (
typedArray , requestIndex )
추상 연산 ValidateAtomicAccessOnIntegerTypedArray는 인자 typedArray (ECMAScript 언어 값 )와
requestIndex (ECMAScript 언어 값 )를 받아, 정상 완료(completion) 로
정수 를 반환하거나,
throw completion 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
taRecord 를 ? ValidateIntegerTypedArray (typedArray ,
false )로 설정합니다.
? ValidateAtomicAccess (taRecord ,
requestIndex )를 반환합니다.
25.4.3.4 RevalidateAtomicAccess ( typedArray ,
byteIndexInBuffer )
추상 연산 RevalidateAtomicAccess는 인자 typedArray (TypedArray )와
byteIndexInBuffer (정수 )를 받아, 정상 완료(completion) 로
unused 를 반환하거나, throw completion 을
반환합니다.
이 연산은 Atomics 메서드에서 모든 인자 강제 변환(coercion)이 수행된 후, 원자적 연산을 위한 backing buffer 내 인덱스를 재검증합니다.
강제 변환은 임의의 부작용을 일으킬 수 있으므로, 버퍼가 경계 밖(out-of-bounds)이 될 수 있습니다. typedArray 의
backing buffer가 SharedArrayBuffer일 때는 예외를 throw하지 않습니다. 호출 시 다음 단계들을 수행합니다:
taRecord 를 MakeTypedArrayWithBufferWitnessRecord (typedArray ,
unordered )로 설정합니다.
참고: typedArray 의 backing buffer가 확장 가능한
SharedArrayBuffer 일 때, 경계 검사는 동기화(synchronizing) 연산이 아닙니다.
IsTypedArrayOutOfBounds (taRecord )
가 true 이면 TypeError 예외를 throw합니다.
Assert :
byteIndexInBuffer ≥ typedArray .[[ByteOffset]] 임을 확인합니다.
byteIndexInBuffer ≥ taRecord .[[CachedBufferByteLength]] 이면 RangeError
예외를 throw합니다.
unused 를 반환합니다.
25.4.3.5 GetWaiterList ( block , i )
추상 연산 GetWaiterList는 인자 block (공유 데이터 블록 )과 i (4로
나누어떨어지는 0 이상의 정수 )를 받아 WaiterList Record 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
i 및 i + 3이 block 의 메모리 내에서 유효한 바이트 오프셋임을 확인합니다.
쌍 (block , i )로 참조되는 WaiterList
Record 를 반환합니다.
25.4.3.6 EnterCriticalSection ( WL )
추상 연산 EnterCriticalSection는 인자 WL (WaiterList Record )를 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 어떤 WaiterList
Record 의 critical
section 에 있지 않음을 확인합니다.
어떤 에이전트 도
WL 의 critical section 에 있지 않을 때까지
기다린 후, WL 의 critical section 에 진입합니다(다른
에이전트 가 진입하지
못하도록 함).
WL .[[MostRecentLeaveEvent]] 가
empty 가 아니면,
참고: WL 의 critical
section 이 한 번 이상 진입된 경우 Synchronize
이벤트 가 LeaveCriticalSection 에
의해 설정됩니다.
execution 을 주변 에이전트 의 Agent
Record 의 [[CandidateExecution]] 필드로 설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로
설정합니다.
enterEvent 를 새 Synchronize
이벤트 로 설정합니다.
enterEvent 를 eventsRecord .[[EventList]] 에 추가합니다.
(WL .[[MostRecentLeaveEvent]] ,
enterEvent )를 eventsRecord .[[AgentSynchronizesWith]] 에 추가합니다.
unused 를 반환합니다.
EnterCriticalSection은 한 에이전트 가 critical section 에 진입하려
할 때 다른 에이전트 가 나올 때까지
기다려야 하는 경우 경합(contention) 이 발생합니다. 경합이 없으면 EnterCriticalSection 호출의
FIFO 순서가 관찰 가능합니다. 경합이 있는 경우, 구현체는 임의의 순서를 선택할 수 있지만 어떤 에이전트 도 무한정 기다리게 해서는 안 됩니다.
25.4.3.7 LeaveCriticalSection ( WL )
추상 연산 LeaveCriticalSection는 인자 WL (WaiterList Record )를 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음을 확인합니다.
execution 을 주변 에이전트 의 Agent
Record 의 [[CandidateExecution]] 필드로
설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로 설정합니다.
leaveEvent 를 새 Synchronize
이벤트 로 설정합니다.
leaveEvent 를 eventsRecord .[[EventList]] 에 추가합니다.
WL .[[MostRecentLeaveEvent]] 에
leaveEvent 를 설정합니다.
WL 의 critical section 에서 나갑니다.
unused 를 반환합니다.
25.4.3.8 AddWaiter ( WL , waiterRecord )
추상 연산 AddWaiter는 인자 WL (WaiterList Record )와
waiterRecord (Waiter Record )를 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음을 확인합니다.
Assert :
WL .[[Waiters]] 에 waiterRecord .[[PromiseCapability]] 와 waiterRecord .[[AgentSignifier]] 가 모두 같은 Waiter
Record 가 없는지 확인합니다.
waiterRecord 를 WL .[[Waiters]] 에 추가합니다.
unused 를 반환합니다.
25.4.3.9 RemoveWaiter ( WL , waiterRecord )
추상 연산 RemoveWaiter는 인자 WL (WaiterList Record )와
waiterRecord (Waiter Record )를 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음을 확인합니다.
Assert :
WL .[[Waiters]] 에 waiterRecord 가 있음을
확인합니다.
WL .[[Waiters]] 에서 waiterRecord 를 제거합니다.
unused 를 반환합니다.
25.4.3.10 RemoveWaiters ( WL , c )
추상 연산 RemoveWaiters는 인자 WL (WaiterList Record )와
c (0 이상의 정수 또는 +∞)를 받아, 리스트 of Waiter
Record 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음을 확인합니다.
len 을 WL .[[Waiters]] 의 요소 개수로 설정합니다.
n 을 min (c , len )로 설정합니다.
L 을 WL .[[Waiters]] 의 처음 n 개
요소로 구성된 리스트 로 설정합니다.
WL .[[Waiters]] 의 처음 n 개 요소를 제거합니다.
L 을 반환합니다.
25.4.3.11 SuspendThisAgent ( WL ,
waiterRecord )
추상 연산 SuspendThisAgent는 인자 WL (WaiterList Record )와
waiterRecord (Waiter Record )를 받고
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음.
Assert :
WL .[[Waiters]] 에 waiterRecord 가 포함되어
있음.
thisAgent 를 AgentSignifier ()로 설정.
Assert :
waiterRecord .[[AgentSignifier]] 가
thisAgent 임.
Assert :
waiterRecord .[[PromiseCapability]] 가
blocking 임.
Assert :
AgentCanSuspend ()가
true 임.
LeaveCriticalSection (WL )을
수행하고, 주변 에이전트 를
waiterRecord .[[TimeoutTime]] 까지 suspend합니다. 이 두
연산을 결합하여 critical section 을 나온 후
suspend되기 전에 알림(notification)이 도착하면 잃어버리지 않도록 합니다. 주변
에이전트 는 timeout 또는 다른 에이전트 가 NotifyWaiter (WL ,
thisAgent )를 호출(즉 Atomics.notify 호출)할 때만 suspend에서 깨어날 수
있습니다.
EnterCriticalSection (WL )을
수행합니다.
unused 를 반환합니다.
25.4.3.12 NotifyWaiter ( WL , waiterRecord
)
추상 연산 NotifyWaiter는 인자 WL (WaiterList Record )와
waiterRecord (Waiter Record )를 받고
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
주변
에이전트 가 WL 의 critical
section 에 있음.
waiterRecord .[[PromiseCapability]] 가
blocking 이면,
waiterRecord .[[AgentSignifier]] 를 가진
에이전트 를 suspend에서 깨웁니다.
참고: 이는 에이전트 가 SuspendThisAgent 에서 실행을
재개하게 만듭니다.
그 밖의 경우 AgentSignifier ()가
waiterRecord .[[AgentSignifier]] 이면,
promiseCapability 를 waiterRecord .[[PromiseCapability]] 로 설정합니다.
! Call (promiseCapability .[[Resolve]] , undefined , «
waiterRecord .[[Result]] »)를 수행합니다.
그 밖의 경우,
EnqueueResolveInAgentJob (waiterRecord .[[AgentSignifier]] , waiterRecord .[[PromiseCapability]] , waiterRecord .[[Result]] )를 수행합니다.
unused 를 반환합니다.
참고
한 에이전트 는 다른
에이전트 의
promise capability를 host 에 전달하는 것 외에는 어떤 방식으로든 접근해서는 안 됩니다.
25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier ,
promiseCapability , resolution )
추상 연산 EnqueueResolveInAgentJob는 인자 agentSignifier (에이전트 식별자 ),
promiseCapability (PromiseCapability
Record ), resolution ("ok" 또는
"timed-out" )를 받고 unused 를 반환합니다. 호출 시 다음 단계들을
수행합니다:
resolveJob 을 agentSignifier , promiseCapability ,
resolution 을 캡처하고 호출 시 다음 단계들을 수행하는 파라미터 없는 Job Abstract Closure 로 만듭니다:
Assert : AgentSignifier ()가
agentSignifier 임을 확인합니다.
! Call (promiseCapability .[[Resolve]] , undefined , «
resolution »)를 수행합니다.
unused 를 반환합니다.
realmInTargetAgent 를 ! GetFunctionRealm (promiseCapability .[[Resolve]] )로 설정합니다.
Assert :
agentSignifier 가 realmInTargetAgent .[[AgentSignifier]] 임을 확인합니다.
HostEnqueueGenericJob (resolveJob ,
realmInTargetAgent )를 수행합니다.
unused 를 반환합니다.
25.4.3.14 DoWait ( mode , typedArray ,
index , value , timeout )
추상 연산 DoWait는 인자 mode (sync 또는
async ), typedArray (ECMAScript 언어 값 ),
index (ECMAScript 언어 값 ),
value (ECMAScript 언어 값 ),
timeout (ECMAScript 언어 값 )를 받고 객체,
"not-equal" , "timed-out" , "ok" 중
하나를 담은 normal completion 또는
throw completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
taRecord 를 ? ValidateIntegerTypedArray (typedArray ,
true )로 설정합니다.
buffer 를 taRecord .[[Object]] .[[ViewedArrayBuffer]] 로 설정합니다.
IsSharedArrayBuffer (buffer )
가 false 이면 TypeError 예외를 throw합니다.
i 를 ? ValidateAtomicAccess (taRecord ,
index )로 설정합니다.
arrayTypeName 을 typedArray .[[TypedArrayName]] 로 설정합니다.
arrayTypeName 이 "BigInt64Array" 이면, v 를
? ToBigInt64 (value )로 설정합니다.
그 밖의 경우, v 를 ? ToInt32 (value )로 설정합니다.
q 를 ? ToNumber (timeout )로 설정합니다.
q 가 NaN 또는 +∞ 𝔽 이면
t 를 +∞로, q 가 -∞ 𝔽 이면 t 를
0으로, 그 밖의 경우 t 를 max (ℝ (q ), 0)로 설정합니다.
mode 가 sync 이고 AgentCanSuspend ()가
false 이면 TypeError 예외를 throw합니다.
block 을 buffer .[[ArrayBufferData]] 로
설정합니다.
offset 을 typedArray .[[ByteOffset]] 로
설정합니다.
byteIndexInBuffer 를 (i × 4) + offset 으로 설정합니다.
WL 을 GetWaiterList (block ,
byteIndexInBuffer )로 설정합니다.
mode 가 sync 이면,
promiseCapability 를 blocking 으로 설정합니다.
resultObject 를 undefined 로 설정합니다.
그 밖의 경우,
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 설정합니다.
resultObject 를 OrdinaryObjectCreate (%Object.prototype% )로
설정합니다.
EnterCriticalSection (WL )을
수행합니다.
elementType 을 TypedArrayElementType (typedArray )로
설정합니다.
w 를 GetValueFromBuffer (buffer ,
byteIndexInBuffer , elementType , true ,
seq-cst )로 설정합니다.
v ≠ w 이면,
LeaveCriticalSection (WL )을
수행합니다.
mode 가 sync 이면
"not-equal" 을 반환합니다.
! CreateDataPropertyOrThrow (resultObject ,
"async" , false )를 수행합니다.
! CreateDataPropertyOrThrow (resultObject ,
"value" , "not-equal" )를 수행합니다.
resultObject 를 반환합니다.
t = 0이고 mode 가 async 이면,
참고: 동기 즉시 타임아웃은 특별 취급하지 않습니다. 비동기 즉시 타임아웃은 빠르게 실패하고 불필요한 Promise job을 피하도록
특별 취급합니다.
LeaveCriticalSection (WL )을
수행합니다.
! CreateDataPropertyOrThrow (resultObject ,
"async" , false )를 수행합니다.
! CreateDataPropertyOrThrow (resultObject ,
"value" , "timed-out" )를 수행합니다.
resultObject 를 반환합니다.
thisAgent 를 AgentSignifier ()로 설정합니다.
now 를 현재 시간 값 (UTC)로 설정합니다.
additionalTimeout 을 구현 정의 0 이상의
수학적 값 으로 설정합니다.
timeoutTime 을 ℝ (now ) + t +
additionalTimeout 으로 설정합니다.
참고: t 가 +∞이면 timeoutTime 도 +∞입니다.
waiterRecord 를 새로운 Waiter Record { [[AgentSignifier]] : thisAgent , [[PromiseCapability]] : promiseCapability , [[TimeoutTime]] : timeoutTime , [[Result]] : "ok" }로 설정합니다.
AddWaiter (WL ,
waiterRecord )를 수행합니다.
mode 가 sync 이면,
SuspendThisAgent (WL ,
waiterRecord )를 수행합니다.
그 밖의 경우 timeoutTime 이 유한 이면,
EnqueueAtomicsWaitAsyncTimeoutJob (WL ,
waiterRecord )를 수행합니다.
LeaveCriticalSection (WL )을
수행합니다.
mode 가 sync 이면 waiterRecord .[[Result]] 를 반환합니다.
! CreateDataPropertyOrThrow (resultObject ,
"async" , true )를 수행합니다.
! CreateDataPropertyOrThrow (resultObject ,
"value" , promiseCapability .[[Promise]] )를 수행합니다.
resultObject 를 반환합니다.
참고
additionalTimeout 은 구현체가 필요에 따라 타임아웃을 보정(padding)하는 데 사용할 수 있습니다. 예를 들어, 전력
소모를 줄이거나 타이머 해상도를 조정해 타이밍 공격을 완화할 때 사용할 수 있습니다. 이 값은 DoWait의 호출마다 다를 수 있습니다.
25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( WL ,
waiterRecord )
추상 연산 EnqueueAtomicsWaitAsyncTimeoutJob는 인자 WL (WaiterList Record ),
waiterRecord (Waiter Record )를 받고
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
timeoutJob 을 WL , waiterRecord 를 캡처하고 호출 시 다음 단계들을
수행하는 파라미터 없는 Job
Abstract Closure 로 만듭니다:
EnterCriticalSection (WL )을
수행합니다.
WL .[[Waiters]] 에 waiterRecord 가
들어 있다면,
timeOfJobExecution 을 현재 시간
값 (UTC)로 설정합니다.
Assert : ℝ (timeOfJobExecution ) ≥
waiterRecord .[[TimeoutTime]]
(시간 값 의
비단조성(non-monotonicity)은 무시).
waiterRecord .[[Result]] 를
"timed-out" 으로 설정합니다.
RemoveWaiter (WL ,
waiterRecord )를 수행합니다.
NotifyWaiter (WL ,
waiterRecord )를 수행합니다.
LeaveCriticalSection (WL )을
수행합니다.
unused 를 반환합니다.
now 를 현재 시간 값 (UTC)로 설정합니다.
currentRealm 을 현재 Realm Record 로 설정합니다.
HostEnqueueTimeoutJob (timeoutJob ,
currentRealm , 𝔽 (waiterRecord .[[TimeoutTime]] ) - now )를 수행합니다.
unused 를 반환합니다.
25.4.3.16 AtomicCompareExchangeInSharedBlock ( block ,
byteIndexInBuffer , elementSize , expectedBytes ,
replacementBytes )
추상 연산 AtomicCompareExchangeInSharedBlock은 인자 block (공유 데이터
블록 ), byteIndexInBuffer (정수 ), elementSize (0 이상의
정수 ),
expectedBytes (바이트
리스트 ), replacementBytes (바이트 리스트 )를 받고,
바이트 리스트 를 반환합니다. 호출 시
다음 단계들을 수행합니다:
execution 을 주변 에이전트 의 Agent
Record 의 [[CandidateExecution]] 필드로
설정합니다.
eventsRecord 를 execution .[[EventsRecords]] 중 [[AgentSignifier]] 가 AgentSignifier ()인
Agent Events Record 로 설정합니다.
rawBytesRead 를 elementSize 길이의 바이트 리스트 로, 각
요소는 비결정적으로 선택된 바이트 값 으로 설정합니다.
참고: 실제 구현에서는 rawBytesRead 는 하드웨어의 load-link, load-exclusive, 또는
read-modify-write 명령의 피연산자로 얻어진 값입니다. 비결정성은 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명하기 위한 메모리
모델의 의미적 규정입니다.
참고: 예상 값과 읽은 값의 비교는 read-modify-write 수정 함수 밖에서
수행되어, 예상 값이 읽은 값과 다를 때 불필요하게 강한 동기화를 방지합니다.
ByteListEqual (rawBytesRead ,
expectedBytes )가 true 이면,
second 를 파라미터 (oldBytes , newBytes )를 받아 원자적으로
newBytes 를 반환하는 새로운 read-modify-write 수정
함수 로 설정합니다.
event 를 ReadModifyWriteSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize , [[Payload]] : replacementBytes , [[ModifyOp]] : second }로 설정합니다.
그 밖의 경우,
event 를 ReadSharedMemory
{ [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize }로
설정합니다.
event 를 eventsRecord .[[EventList]] 에
추가합니다.
Chosen Value Record { [[Event]] : event , [[ChosenValue]] : rawBytesRead }를
execution .[[ChosenValues]] 에 추가합니다.
rawBytesRead 를 반환합니다.
25.4.3.17 AtomicReadModifyWrite ( typedArray ,
index , value , op )
추상 연산 AtomicReadModifyWrite는 인자 typedArray (ECMAScript 언어 값 ),
index (ECMAScript 언어 값 ),
value (ECMAScript 언어 값 ), op
(read-modify-write 수정 함수 )를 받고, Number
또는 BigInt를 담은 normal completion 또는
throw completion 를
반환합니다. op 는 두 바이트 리스트
인자를 받아 바이트 리스트 를 반환합니다. 이 연산은
값을 원자적으로 불러오고, 다른 값과 결합하여 저장하며, 불러온 값을 반환합니다. 호출 시 다음 단계들을 수행합니다:
byteIndexInBuffer 를 ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index )로 설정합니다.
typedArray .[[ContentType]] 가
bigint 이면, v 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우, v 를 𝔽 (? ToIntegerOrInfinity (value ))로
설정합니다.
? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer )를 수행합니다.
buffer 를 typedArray .[[ViewedArrayBuffer]] 로 설정합니다.
elementType 을 TypedArrayElementType (typedArray )로
설정합니다.
GetModifySetValueInBuffer (buffer ,
byteIndexInBuffer , elementType , v , op )를
반환합니다.
25.4.3.18 ByteListBitwiseOp ( op , xBytes ,
yBytes )
추상 연산 ByteListBitwiseOp는 인자 op (&, ^,
|), xBytes (바이트
리스트 ), yBytes (바이트 리스트 )를 받고,
바이트 리스트 를 반환합니다. 이 연산은
인자들의 모든 바이트
값 에 대해 비트 연산을 원자적으로 수행하여 바이트 리스트 를 반환합니다. 호출 시
다음 단계들을 수행합니다:
Assert :
xBytes 와 yBytes 는 동일한 개수의 요소를 가짐.
result 를 새로운 빈 바이트
리스트 로 설정합니다.
i 를 0으로 설정합니다.
xBytes 의 각 요소 xByte 에 대해 다음을 수행합니다:
yByte 를 yBytes [i ]로 설정합니다.
op 가 &이면,
resultByte 를 xByte 와 yByte 에 비트 AND
연산을 적용한 결과로 설정합니다.
그 밖의 경우 op 가 ^이면,
resultByte 를 xByte 와 yByte 에 비트
XOR(배타적 OR) 연산을 적용한 결과로 설정합니다.
그 밖의 경우,
Assert : op 가
|임을 확인합니다.
resultByte 를 xByte 와 yByte 에 비트 OR(포괄적
OR) 연산을 적용한 결과로 설정합니다.
i 를 i + 1로 증가시킵니다.
resultByte 를 result 에 추가합니다.
result 를 반환합니다.
25.4.3.19 ByteListEqual ( xBytes , yBytes )
추상 연산 ByteListEqual은 인자 xBytes (바이트 리스트 ),
yBytes (바이트
리스트 )를 받고, Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:
xBytes 와 yBytes 가 같은 개수의 요소를 가지지 않으면 false 를
반환합니다.
i 를 0으로 설정합니다.
xBytes 의 각 요소 xByte 에 대해 다음을 수행합니다:
yByte 를 yBytes [i ]로 설정합니다.
xByte ≠ yByte 이면 false 를 반환합니다.
i 를 i + 1로 증가시킵니다.
true 를 반환합니다.
25.4.4 Atomics.add ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
add 를 파라미터 (xBytes , yBytes )를 가지며 typedArray 를
캡처하는 새로운 read-modify-write 수정 함수 로 설정하고,
호출 시 원자적으로 다음 단계들을 수행합니다:
type 을 TypedArrayElementType (typedArray )로
설정합니다.
isLittleEndian 을 주변 에이전트 의
Agent
Record 의 [[LittleEndian]] 필드 값으로
설정합니다.
x 를 RawBytesToNumeric (type ,
xBytes , isLittleEndian )로 설정합니다.
y 를 RawBytesToNumeric (type ,
yBytes , isLittleEndian )로 설정합니다.
x 가 Number 이면,
sum 을 Number::add (x ,
y )로 설정합니다.
그 밖의 경우,
Assert : x 가 BigInt 임을
확인합니다.
sum 을 BigInt::add (x ,
y )로 설정합니다.
sumBytes 를 NumericToRawBytes (type ,
sum , isLittleEndian )로 설정합니다.
Assert : sumBytes ,
xBytes , yBytes 가 동일한 개수의 요소를 가짐.
sumBytes 를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , add )를 반환합니다.
25.4.5 Atomics.and ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
and 를 파라미터 (xBytes , yBytes )를 가지며 아무 것도 캡처하지 않는 새로운
read-modify-write 수정 함수 로 설정하고,
호출 시 원자적으로 다음 단계들을 수행합니다:
ByteListBitwiseOp (&,
xBytes , yBytes )를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , and )를 반환합니다.
25.4.6 Atomics.compareExchange ( typedArray ,
index , expectedValue , replacementValue )
이 함수는 호출 시 다음 단계들을 수행합니다:
byteIndexInBuffer 를 ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index )로 설정합니다.
buffer 를 typedArray .[[ViewedArrayBuffer]] 로
설정합니다.
block 을 buffer .[[ArrayBufferData]] 로 설정합니다.
typedArray .[[ContentType]] 가
bigint 이면,
expected 를 ? ToBigInt (expectedValue )로
설정합니다.
replacement 를 ? ToBigInt (replacementValue )로
설정합니다.
그 밖의 경우,
expected 를 𝔽 (? ToIntegerOrInfinity (expectedValue ))로
설정합니다.
replacement 를 𝔽 (? ToIntegerOrInfinity (replacementValue ))로
설정합니다.
? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer )를 수행합니다.
elementType 을 TypedArrayElementType (typedArray )로
설정합니다.
elementSize 를 TypedArrayElementSize (typedArray )로
설정합니다.
isLittleEndian 을 주변 에이전트 의 Agent Record 의 [[LittleEndian]] 필드 값으로 설정합니다.
expectedBytes 를 NumericToRawBytes (elementType ,
expected , isLittleEndian )로 설정합니다.
replacementBytes 를 NumericToRawBytes (elementType ,
replacement , isLittleEndian )로 설정합니다.
IsSharedArrayBuffer (buffer )
가 true 이면,
rawBytesRead 를 AtomicCompareExchangeInSharedBlock (block ,
byteIndexInBuffer , elementSize , expectedBytes ,
replacementBytes )로 설정합니다.
그 밖의 경우,
rawBytesRead 를 elementSize 길이의 바이트 리스트 로,
각 요소는 block [byteIndexInBuffer ]에서 시작하는
elementSize 바이트 순서대로 설정합니다.
ByteListEqual (rawBytesRead ,
expectedBytes )가 true 이면,
replacementBytes 의 개별 바이트를 block 의
block [byteIndexInBuffer ]에서 시작하여 저장합니다.
RawBytesToNumeric (elementType ,
rawBytesRead , isLittleEndian )를 반환합니다.
25.4.7 Atomics.exchange ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
second 를 파라미터 (oldBytes , newBytes )를 가지며 아무 것도 캡처하지 않는
새로운 read-modify-write 수정 함수 로 설정하고,
호출 시 원자적으로 다음 단계들을 수행합니다:
newBytes 를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , second )를 반환합니다.
25.4.8 Atomics.isLockFree ( size )
이 함수는 호출 시 다음 단계들을 수행합니다:
n 을 ? ToIntegerOrInfinity (size )로 설정합니다.
AR 을 주변 에이전트 의 Agent Record 로 설정합니다.
n = 1이면 AR .[[IsLockFree1]] 를 반환합니다.
n = 2이면 AR .[[IsLockFree2]] 를 반환합니다.
n = 4이면 true 를 반환합니다.
n = 8이면 AR .[[IsLockFree8]] 를 반환합니다.
false 를 반환합니다.
참고
이 함수는 최적화 프리미티브입니다. 직관적으로, 원자 프리미티브(compareExchange, load,
store, add, sub, and,
or, xor, exchange)가 크기 n 바이트의 데이터에 대해,
주변
에이전트 가 해당 데이터 바깥의 락을 취하지 않고 수행된다면
Atomics.isLockFree(n )는 true 를 반환합니다. 고성능 알고리즘은
이 함수를 사용해 critical section 에서 락과 원자 연산 중 어떤
것을 사용할지 결정합니다. 원자 프리미티브가 lock-free가 아니면 알고리즘에서 직접 락을 제공하는 것이 효율적일 수 있습니다.
Atomics.isLockFree(4)는 항상 true 를 반환합니다. 모든 관련 하드웨어에서 지원
가능하기 때문입니다. 이를 가정하면 프로그램이 일반적으로 더 단순해집니다.
이 함수가 반환하는 값과 무관하게, 모든 원자 연산은 원자성을 보장합니다. 예를 들어, 연산 도중 눈에 띄는 작업이 중간에 발생(예: "tearing")하는
일은 없습니다.
25.4.9 Atomics.load ( typedArray , index )
이 함수는 호출 시 다음 단계들을 수행합니다:
byteIndexInBuffer 를 ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index )로 설정합니다.
? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer )를 수행합니다.
buffer 를 typedArray .[[ViewedArrayBuffer]] 로
설정합니다.
elementType 을 TypedArrayElementType (typedArray )로
설정합니다.
GetValueFromBuffer (buffer ,
byteIndexInBuffer , elementType , true ,
seq-cst )를 반환합니다.
25.4.10 Atomics.or ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
or 를 파라미터 (xBytes , yBytes )를 가지며 아무 것도 캡처하지 않는 새로운
read-modify-write 수정 함수 로 설정하고,
호출 시 원자적으로 다음 단계들을 수행합니다:
ByteListBitwiseOp (|,
xBytes , yBytes )를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , or )를 반환합니다.
25.4.11 Atomics.store ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
byteIndexInBuffer 를 ? ValidateAtomicAccessOnIntegerTypedArray (typedArray ,
index )로 설정합니다.
typedArray .[[ContentType]] 가
bigint 이면, v 를 ? ToBigInt (value )로 설정합니다.
그 밖의 경우, v 를 𝔽 (? ToIntegerOrInfinity (value ))로
설정합니다.
? RevalidateAtomicAccess (typedArray ,
byteIndexInBuffer )를 수행합니다.
buffer 를 typedArray .[[ViewedArrayBuffer]] 로
설정합니다.
elementType 을 TypedArrayElementType (typedArray )로
설정합니다.
SetValueInBuffer (buffer ,
byteIndexInBuffer , elementType , v ,
true , seq-cst )를 수행합니다.
v 를 반환합니다.
25.4.12 Atomics.sub ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
subtract 를 파라미터 (xBytes , yBytes )를 가지며
typedArray 를 캡처하는 새로운 read-modify-write 수정
함수 로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
type 을 TypedArrayElementType (typedArray )로
설정합니다.
isLittleEndian 을 주변 에이전트 의
Agent
Record 의 [[LittleEndian]] 필드 값으로
설정합니다.
x 를 RawBytesToNumeric (type ,
xBytes , isLittleEndian )로 설정합니다.
y 를 RawBytesToNumeric (type ,
yBytes , isLittleEndian )로 설정합니다.
x 가 Number 이면,
difference 를 Number::subtract (x ,
y )로 설정합니다.
그 밖의 경우,
Assert : x 가 BigInt 임을
확인합니다.
difference 를 BigInt::subtract (x ,
y )로 설정합니다.
differenceBytes 를 NumericToRawBytes (type ,
difference , isLittleEndian )로 설정합니다.
Assert : differenceBytes ,
xBytes , yBytes 가 동일한 개수의 요소를 가짐.
differenceBytes 를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , subtract )를 반환합니다.
25.4.13 Atomics.wait ( typedArray , index ,
value , timeout )
이 함수는 주변
에이전트 를 대기 큐에 넣고, 알림을 받을 때까지 또는 대기 시간이 초과될 때까지 suspend시키며, 그 경우를 구분하는 문자열을
반환합니다.
호출 시 다음 단계들을 수행합니다:
? DoWait (sync ,
typedArray , index , value , timeout )를 반환합니다.
25.4.14 Atomics.waitAsync ( typedArray , index ,
value , timeout )
이 함수는 호출한 에이전트 가 알림을 받거나
타임아웃에 도달하면 resolve되는 Promise를 반환합니다.
호출 시 다음 단계들을 수행합니다:
? DoWait (async ,
typedArray , index , value , timeout )를 반환합니다.
25.4.15 Atomics.notify ( typedArray , index ,
count )
이 함수는 대기 큐에서 잠들어 있는 일부 에이전트 에게 알림을 보냅니다.
호출 시 다음 단계들을 수행합니다:
taRecord 를 ? ValidateIntegerTypedArray (typedArray ,
true )로 설정합니다.
byteIndexInBuffer 를 ? ValidateAtomicAccess (taRecord ,
index )로 설정합니다.
count 가 undefined 이면,
c 를 +∞로 설정합니다.
그 밖의 경우,
intCount 를 ? ToIntegerOrInfinity (count )로
설정합니다.
c 를 max (intCount , 0)로 설정합니다.
buffer 를 typedArray .[[ViewedArrayBuffer]] 로
설정합니다.
block 을 buffer .[[ArrayBufferData]] 로 설정합니다.
IsSharedArrayBuffer (buffer )
가 false 이면 +0 𝔽 를 반환합니다.
WL 을 GetWaiterList (block ,
byteIndexInBuffer )로 설정합니다.
EnterCriticalSection (WL )을
수행합니다.
S 를 RemoveWaiters (WL ,
c )로 설정합니다.
S 의 각 요소 W 에 대해 다음을 수행합니다:
NotifyWaiter (WL ,
W )를 수행합니다.
LeaveCriticalSection (WL )을
수행합니다.
n 을 S 의 요소 개수로 설정합니다.
𝔽 (n )를
반환합니다.
25.4.16 Atomics.xor ( typedArray , index ,
value )
이 함수는 호출 시 다음 단계들을 수행합니다:
xor 를 파라미터 (xBytes , yBytes )를 가지며 아무 것도 캡처하지 않는 새로운
read-modify-write 수정 함수 로 설정하고,
호출 시 원자적으로 다음 단계들을 수행합니다:
ByteListBitwiseOp (^,
xBytes , yBytes )를 반환합니다.
? AtomicReadModifyWrite (typedArray ,
index , value , xor )를 반환합니다.
25.4.17 Atomics [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"Atomics" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
25.5 JSON 객체
JSON 객체:
%JSON% 입니다.
글로벌
객체 의 "JSON" 프로퍼티의 초기 값입니다.
일반
객체 입니다.
parse와 stringify 두 함수를 포함하며, 이 함수들은 JSON 텍스트를 파싱하고 생성하는 데 사용됩니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
[[Construct]] 내부 메서드를 가지지 않으므로 new 연산자로 생성자 로 사용할 수 없습니다.
[[Call]] 내부 메서드를 가지지 않으므로 함수로 호출할 수 없습니다.
JSON 데이터 교환 형식은 ECMA-404에 정의되어 있습니다. 이 명세에서 사용되는 JSON 교환 형식은 ECMA-404에서 설명된 것과 정확히 같습니다.
JSON.parse와 JSON.stringify의 적합한 구현은 ECMA-404 명세에서 설명된 정확한 교환 형식을 삭제나 확장 없이
지원해야 합니다.
25.5.1 JSON.parse ( text [ , reviver ] )
이 함수는 JSON 텍스트(JSON 형식의 문자열)를 파싱하여 ECMAScript 언어 값 를
생성합니다. JSON 형식은 ECMAScript 리터럴, 배열 이니셜라이저, 객체 이니셜라이저의 문법과 유사하게 리터럴, 배열, 객체를 표현합니다. 파싱 후, JSON
객체는 ECMAScript 객체로 실현됩니다. JSON 배열은 ECMAScript Array 인스턴스로 실현됩니다. JSON 문자열, 숫자, 불리언, 그리고 null은
ECMAScript의 문자열, 숫자, 불리언, null 로 실현됩니다.
선택적 reviver 파라미터는 key 와 value 두 개의 파라미터를 받는 함수입니다. 결과를 필터하고 변환할 수
있습니다. 파싱 과정에서 생성되는 각 key /value 쌍에 대해 호출되며, 반환 값이 원래 값 대신 사용됩니다. 받은 값을 그대로
반환하면 구조는 변경되지 않습니다. undefined 를 반환하면 해당 프로퍼티는 결과에서 삭제됩니다.
jsonString 을 ? ToString (text )로 설정합니다.
unfiltered 를 ? ParseJSON (jsonString )로 설정합니다.
IsCallable (reviver )가
true 이면,
root 를 OrdinaryObjectCreate (%Object.prototype% )로
설정합니다.
rootName 을 빈 문자열로 설정합니다.
! CreateDataPropertyOrThrow (root ,
rootName , unfiltered )를 수행합니다.
? InternalizeJSONProperty (root ,
rootName , reviver )를 반환합니다.
그 밖의 경우,
unfiltered 를 반환합니다.
이 함수의 "length" 프로퍼티 값은 2 𝔽 입니다.
25.5.1.1 ParseJSON ( text )
추상 연산 ParseJSON은 인자 text (문자열)를 받고, normal completion 에
ECMAScript 언어 값 또는 throw completion 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
StringToCodePoints (text )
가 ECMA-404에서 명시된 유효한 JSON 텍스트가 아니면 SyntaxError 예외를 throw합니다.
scriptString 을 문자열 연결 로 "(" ,
text , ");" 을 합쳐 생성합니다.
script 를 ParseText (scriptString ,
Script )로 설정합니다.
참고: 조기
에러 규칙은 13.2.5.1 에
정의되어 있으며, 위 ParseText 호출에 대해 특별 처리를 합니다.
Assert :
script 는 파싱 노드 여야 합니다.
result 를 ! Evaluation (script )로 설정합니다.
참고: PropertyDefinitionEvaluation
의미는 13.2.5.5 에
정의되어 있으며, 위 평가에 대해 특별 처리를 합니다.
Assert : result 는 문자열, 숫자, 불리언,
ArrayLiteral 또는
ObjectLiteral 로
정의된 객체, null 중 하나여야 합니다.
result 를 반환합니다.
적합한 JSON.parse 구현은 JSON 문법을 확장할 수 없습니다. 구현체가 수정된 또는 확장된 JSON 교환 형식을 지원하고 싶다면 별도의
파싱 함수를 정의해야 합니다.
참고 1
유효한 JSON 텍스트는 ECMAScript PrimaryExpression 문법의 부분집합입니다.
1 단계는 jsonString 이
그 부분집합에 부합하는지 검증하며, 8 단계는 평가 결과가 적합한 타입의 값임을
단언합니다.
하지만 13.2.5.5 가
ParseJSON 동안 다르게 동작하므로, 동일한 소스 텍스트가 PrimaryExpression 으로 평가할 때와
JSON으로 평가할 때 결과가 다를 수 있습니다. 또한 객체 리터럴에서 중복된 "__proto__" 프로퍼티에 대한
Early Error가 ParseJSON에서는 적용되지 않으므로, ParseJSON이 허용하는 모든 텍스트가 문법에는 맞더라도 PrimaryExpression 으로서도 유효한 것은
아닙니다.
참고 2
객체 내에 중복된 이름 문자열이 있을 경우, 동일한 키에 대해 앞에 위치한 값들은 덮어쓰기 됩니다.
25.5.1.2 InternalizeJSONProperty ( holder ,
name , reviver )
추상 연산 InternalizeJSONProperty는 인자 holder (객체), name (문자열),
reviver (함수 객체 )를 받고, normal completion 에
ECMAScript 언어 값 또는 throw completion 을
반환합니다.
참고
이 알고리즘은 [[Delete]] 또는 CreateDataProperty 가
false 를 반환하더라도 일부러 예외를 throw하지 않습니다.
호출 시 다음 단계들을 수행합니다:
val 을 ? Get (holder , name )로
설정합니다.
val 이 객체 면,
isArray 를 ? IsArray (val )로 설정합니다.
isArray 가 true 면,
len 을 ? LengthOfArrayLike (val )로
설정합니다.
I 를 0으로 설정합니다.
I < len 동안 반복합니다,
prop 을 ! ToString (𝔽 (I ))로 설정합니다.
newElement 를 ? InternalizeJSONProperty (val ,
prop , reviver )로 설정합니다.
newElement 가 undefined 이면,
? val .[[Delete]] (prop )를
수행합니다.
그 밖의 경우,
? CreateDataProperty (val ,
prop , newElement )를 수행합니다.
I 를 I + 1로 설정합니다.
그 밖의 경우,
keys 를 ? EnumerableOwnProperties (val ,
key )로 설정합니다.
keys 의 각 문자열 P 에 대해 다음을 수행합니다:
newElement 를 ? InternalizeJSONProperty (val ,
P , reviver )로 설정합니다.
newElement 가 undefined 이면,
? val .[[Delete]] (P )를
수행합니다.
그 밖의 경우,
? CreateDataProperty (val ,
P , newElement )를 수행합니다.
? Call (reviver ,
holder , « name , val »)를 반환합니다.
25.5.2 JSON.stringify ( value [ , replacer [ ,
space ] ] )
이 함수는 ECMAScript 언어 값 를 나타내는 UTF-16 인코딩
JSON 형식의 문자열 또는 undefined 를 반환합니다. 세 개의 매개변수를 받을 수 있습니다. value
매개변수는 ECMAScript 언어 값 로, 보통 객체나 배열이지만 문자열,
불리언, 숫자 또는 null 일 수도 있습니다. 선택적 replacer 매개변수는 객체와 배열의 문자열화 방식을 변경하는
함수이거나, 객체의 어떤 프로퍼티를 문자열화할지 선택하는 문자열 및 숫자 배열일 수 있습니다. 선택적 space 매개변수는 문자열 또는 숫자로, 결과에 가독성을
높이기 위해 공백을 삽입할 수 있습니다.
호출 시 다음 단계들을 수행합니다:
stack 을 새로운 빈 리스트 로 설정합니다.
indent 를 빈 문자열로 설정합니다.
PropertyList 를 undefined 로 설정합니다.
ReplacerFunction 을 undefined 로 설정합니다.
replacer 가 객체 이면,
IsCallable (replacer )가
true 이면,
ReplacerFunction 을 replacer 로 설정합니다.
그 밖의 경우,
isArray 를 ? IsArray (replacer )로
설정합니다.
isArray 가 true 면,
PropertyList 를 새로운 빈 리스트 로
설정합니다.
len 을 ? LengthOfArrayLike (replacer )로
설정합니다.
k 를 0으로 설정합니다.
k < len 동안 반복합니다,
prop 을 ! ToString (𝔽 (k ))로
설정합니다.
v 를 ? Get (replacer ,
prop )로 설정합니다.
item 을 undefined 로 설정합니다.
v 가 문자열 이면,
item 을 v 로 설정합니다.
그 밖의 경우 v 가 숫자 이면,
item 을 ! ToString (v )로
설정합니다.
그 밖의 경우 v 가 객체 이면,
v 에 [[StringData]] 또는 [[NumberData]] 내부 슬롯이
있으면 item 을 ? ToString (v )로
설정합니다.
item 이 undefined 가 아니고
PropertyList 에 item 이 없으면,
item 을 PropertyList 에 추가합니다.
k 를 k + 1로 설정합니다.
space 가 객체 이면,
space 에 [[NumberData]] 내부 슬롯이 있으면,
space 를 ? ToNumber (space )로
설정합니다.
그 밖의 경우 space 에 [[StringData]] 내부 슬롯이 있으면,
space 를 ? ToString (space )로
설정합니다.
space 가 숫자 이면,
spaceMV 를 ! ToIntegerOrInfinity (space )로
설정합니다.
spaceMV 를 min (10, spaceMV )로 설정합니다.
spaceMV < 1이면 gap 을 빈 문자열로, 그 밖의 경우 gap 을 코드
유닛 0x0020(SPACE)을 spaceMV 번 반복한 문자열 값으로 설정합니다.
그 밖의 경우 space 가 문자열 이면,
space 의 길이가 10 이하이면 gap 을 space 로, 그 밖의 경우
gap 을 space 의 0~10 부분 문자열로 설정합니다.
그 밖의 경우,
gap 을 빈 문자열로 설정합니다.
wrapper 를 OrdinaryObjectCreate (%Object.prototype% )로
설정합니다.
! CreateDataPropertyOrThrow (wrapper ,
빈 문자열, value )를 수행합니다.
state 를 JSON Serialization Record {
[[ReplacerFunction]] :
ReplacerFunction , [[Stack]] : stack , [[Indent]] : indent , [[Gap]] :
gap , [[PropertyList]] :
PropertyList }로 설정합니다.
? SerializeJSONProperty (state , 빈
문자열, wrapper )를 반환합니다.
이 함수의 "length" 프로퍼티 값은 3 𝔽 입니다.
참고 1
JSON 구조는 임의의 깊이로 중첩될 수 있지만, 반드시 비순환적이어야 합니다. value 가 순환 구조이거나 순환 구조를 포함하는 경우 이
함수는 TypeError 예외를 throw해야 합니다. 아래는 문자열화할 수 없는 값의 예시입니다:
a = [];
a[0 ] = a;
my_text = JSON .stringify (a);
참고 2
기호적 원시값은 다음과 같이 렌더링됩니다:
null 값은 JSON 텍스트에서 "null" 문자열 값으로 렌더링됩니다.
undefined 값은 렌더링되지 않습니다.
true 값은 JSON 텍스트에서 "true" 문자열 값으로 렌더링됩니다.
false 값은 JSON 텍스트에서 "false" 문자열 값으로 렌더링됩니다.
참고 3
문자열 값은 QUOTATION MARK (") 코드 유닛으로 감싸집니다. " 및 \ 코드
유닛은 \ 접두사로 이스케이프 처리됩니다. 제어 문자 코드 유닛은 \uHHHH, 또는 더 짧은
\b (백스페이스), \f (폼피드), \n (라인피드), \r
(캐리지 리턴), \t (탭) 이스케이프 시퀀스로 대체됩니다.
참고 4
Finite 숫자는
ToString (number )을 호출한 것처럼
문자열화됩니다. NaN 및 Infinity 는 부호와 관계없이
"null" 문자열 값으로 표현됩니다.
참고 5
JSON 표현이 없는 값(undefined 및 함수 등)은 문자열을 생성하지 않고
undefined 값을 생성합니다. 배열에서는 이러한 값이 "null" 문자열 값으로
표현되고, 객체에서는 표현 불가 값이 프로퍼티에서 제외됩니다.
참고 6
객체는 U+007B(왼쪽 중괄호)로 시작해 0개 이상의 프로퍼티(각 프로퍼티는 U+002C(쉼표)로 구분), U+007D(오른쪽 중괄호)로 닫힙니다. 프로퍼티는
프로퍼티
이름 을 나타내는 따옴표로 감싼 문자열, U+003A(콜론), 문자열화된 프로퍼티 값으로 구성됩니다. 배열은
U+005B(왼쪽 대괄호)로 시작해 0개 이상의 값(각 값은 U+002C(쉼표)로 구분), U+005D(오른쪽 대괄호)로 닫힙니다.
25.5.2.1 JSON Serialization Record
JSON Serialization Record 는
JSON 형식으로 직렬화를 가능하게 하는 Record
값입니다.
JSON Serialization Record는 표 80 에 나열된 필드를 가집니다.
표 80: JSON Serialization
Record 필드
필드 이름
값
의미
[[ReplacerFunction]]
함수 객체 또는
undefined
객체 프로퍼티에 대한 대체 값을 제공하는 함수(JSON.stringify의 replacer 매개변수로부터).
[[PropertyList]]
문자열의 리스트
또는 undefined
비배열 객체 직렬화 시 포함할 프로퍼티 이름(JSON.stringify의 replacer 매개변수로부터).
[[Gap]]
문자열
들여쓰기 단위(JSON.stringify의 space 매개변수로부터).
[[Stack]]
객체
리스트
직렬화 중인 중첩 객체 집합. 순환 구조 감지에 사용됨.
[[Indent]]
문자열
현재 들여쓰기.
25.5.2.2 SerializeJSONProperty ( state ,
key , holder )
추상 연산 SerializeJSONProperty는 인자 state (JSON Serialization Record ),
key (문자열), holder (객체)를 받고, 문자열 또는 undefined 를 담은
normal completion 또는
throw completion 을
반환합니다. 호출 시 다음 단계들을 수행합니다:
value 를 ? Get (holder , key )로
설정합니다.
value 가 객체 이거나 value 가 BigInt 이면,
toJSON 를 ? GetV (value ,
"toJSON" )로 설정합니다.
IsCallable (toJSON )가
true 면,
value 를 ? Call (toJSON ,
value , « key »)로 설정합니다.
state .[[ReplacerFunction]] 가
undefined 가 아니면,
value 를 ? Call (state .[[ReplacerFunction]] , holder , «
key , value »)로 설정합니다.
value 가 객체 이면,
value 에 [[NumberData]] 내부 슬롯이 있으면,
value 를 ? ToNumber (value )로
설정합니다.
그 밖의 경우 value 에 [[StringData]] 내부 슬롯이
있으면,
value 를 ? ToString (value )로
설정합니다.
그 밖의 경우 value 에 [[BooleanData]] 내부 슬롯이
있으면,
value 를 value .[[BooleanData]] 로 설정합니다.
그 밖의 경우 value 에 [[BigIntData]] 내부 슬롯이
있으면,
value 를 value .[[BigIntData]] 로 설정합니다.
value 가 null 이면 "null" 를 반환합니다.
value 가 true 이면 "true" 를 반환합니다.
value 가 false 이면 "false" 를 반환합니다.
value 가 문자열 이면
QuoteJSONString (value )를
반환합니다.
value 가 숫자 이면,
value 가 finite 이면 ! ToString (value )를
반환합니다.
"null" 를 반환합니다.
value 가 BigInt 이면
TypeError 예외를 throw합니다.
value 가 객체 이고 IsCallable (value )가
false 이면,
isArray 를 ? IsArray (value )로 설정합니다.
isArray 가 true 이면 ? SerializeJSONArray (state ,
value )를 반환합니다.
? SerializeJSONObject (state ,
value )를 반환합니다.
undefined 를 반환합니다.
25.5.2.3 QuoteJSONString ( value )
추상 연산 QuoteJSONString은 인자 value (문자열)를 받고 문자열을 반환합니다. value 를 코드 유닛
0x0022(따옴표)로 감싸고 특정 코드 유닛을 이스케이프 처리합니다. 이 연산은 value 를 6.1.4 에 설명된 대로
UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다. 호출 시 다음 단계들을 수행합니다:
product 를 코드 유닛 0x0022(따옴표)만 포함하는 문자열 값으로 설정합니다.
StringToCodePoints (value )의
각 코드 포인트 C 에 대해 다음을 수행합니다:
C 가 표
81 의 "Code Point" 열에 나열되어 있으면,
product 를 문자열
연결 로 product 와 해당 행의 "Escape
Sequence" 열에 지정된 C 의 이스케이프 시퀀스를 연결한 값으로 설정합니다.
그 밖의 경우 C 의 숫자 값이 0x0020(SPACE)보다 작거나 C 가 리드 서러게이트 또는 트레일링 서러게이트 와 동일한 값이면,
unit 을 C 의 숫자 값에 해당하는 코드 유닛으로 설정합니다.
product 를 문자열
연결 로 product 와 UnicodeEscape (unit )을
연결한 값으로 설정합니다.
그 밖의 경우,
product 를 문자열
연결 로 product 와 UTF16EncodeCodePoint (C )을
연결한 값으로 설정합니다.
product 를 문자열 연결 로 product 와 코드
유닛 0x0022(따옴표)를 연결한 값으로 설정합니다.
product 를 반환합니다.
표 81: JSON 단일 문자 이스케이프 시퀀스
코드 포인트
유니코드 문자 이름
이스케이프 시퀀스
U+0008
백스페이스
\b
U+0009
문자 탭
\t
U+000A
줄 바꿈 (LF)
\n
U+000C
폼 피드 (FF)
\f
U+000D
캐리지 리턴 (CR)
\r
U+0022
큰따옴표
\"
U+005C
역슬래시
\\
25.5.2.4 UnicodeEscape ( C )
추상 연산 UnicodeEscape는 인자 C (코드 유닛)를 받아 문자열을 반환합니다. C 를 유니코드 이스케이프 시퀀스로
나타냅니다. 호출 시 다음 단계들을 수행합니다:
n 을 C 의 숫자 값으로 설정합니다.
Assert :
n ≤ 0xFFFF.
hex 를 n 의 소문자 16진수 문자열 표현으로 설정합니다.
코드 유닛 0x005C(역슬래시), "u" , StringPad (hex , 4,
"0" , start )를 문자열
연결 로 합친 결과를 반환합니다.
25.5.2.5 SerializeJSONObject ( state ,
value )
추상 연산 SerializeJSONObject는 인자 state (JSON 직렬화 레코드 ), value
(객체)를 받고, normal completion 에
문자열 또는 throw completion 을
반환합니다. 객체를 직렬화합니다. 호출 시 다음 단계들을 수행합니다:
state .[[Stack]] 에 value 가 포함되어 있으면, 구조가
순환적이므로 TypeError 예외를 throw합니다.
value 를 state .[[Stack]] 에 추가합니다.
stepBack 을 state .[[Indent]] 로 설정합니다.
state .[[Indent]] 를 state .[[Indent]] 와 state .[[Gap]] 을 문자열 연결 한 값으로
설정합니다.
state .[[PropertyList]] 가
undefined 가 아니면,
K 를 state .[[PropertyList]] 로
설정합니다.
그 밖의 경우,
K 를 ? EnumerableOwnProperties (value ,
key )로 설정합니다.
partial 을 새로운 빈 리스트 로 설정합니다.
K 의 각 요소 P 에 대해 다음을 수행합니다:
strP 를 ? SerializeJSONProperty (state ,
P , value )로 설정합니다.
strP 가 undefined 가 아니면,
member 를 QuoteJSONString (P )로
설정합니다.
member 를 문자열
연결 (member ,
":" )로 설정합니다.
state .[[Gap]] 이 빈 문자열이 아니면,
member 를 문자열
연결 (member , 코드 유닛 0x0020
(공백))으로 설정합니다.
member 를 문자열
연결 (member , strP )로
설정합니다.
member 를 partial 에 추가합니다.
partial 이 비어 있으면,
final 을 "{}" 로 설정합니다.
그 밖의 경우,
state .[[Gap]] 이 빈 문자열이면,
properties 를 partial 의 모든 문자열 요소를 인접한 각 쌍을 코드 유닛
0x002C(콤마)로 구분하여 연결한 문자열 값으로 설정합니다. 첫번째와 마지막 문자열 앞뒤에는 콤마를 삽입하지 않습니다.
final 을 문자열
연결 ("{" ,
properties , "}" )로 설정합니다.
그 밖의 경우,
separator 를 코드 유닛 0x002C(콤마), 코드 유닛 0x000A(줄 바꿈),
state .[[Indent]] 를 문자열 연결 한 값으로
설정합니다.
properties 를 partial 의 모든 문자열 요소를 인접한 각 쌍을
separator 로 구분하여 연결한 문자열 값으로 설정합니다. separator 는
첫번째와 마지막 문자열 앞뒤에는 삽입하지 않습니다.
final 을 문자열
연결 ("{" , 코드 유닛 0x000A(줄
바꿈), state .[[Indent]] ,
properties , 코드 유닛 0x000A(줄 바꿈), stepBack ,
"}" )로 설정합니다.
state .[[Stack]] 의 마지막 요소를 제거합니다.
state .[[Indent]] 를 stepBack 으로 설정합니다.
final 을 반환합니다.
25.5.2.6 SerializeJSONArray ( state , value
)
추상 연산 SerializeJSONArray는 인자 state (JSON 직렬화 레코드 ), value
(ECMAScript 언어 값 )를 받고, normal completion 에
문자열 또는 throw completion 을
반환합니다. 배열을 직렬화합니다. 호출 시 다음 단계들을 수행합니다:
state .[[Stack]] 에 value 가 포함되어 있으면, 구조가
순환적이므로 TypeError 예외를 throw합니다.
value 를 state .[[Stack]] 에 추가합니다.
stepBack 을 state .[[Indent]] 로 설정합니다.
state .[[Indent]] 를 문자열
연결 (state .[[Indent]] ,
state .[[Gap]] )로 설정합니다.
partial 을 새로운 빈 리스트 로 설정합니다.
len 을 ? LengthOfArrayLike (value )로
설정합니다.
index 를 0으로 설정합니다.
index < len 동안 반복합니다,
strP 를 ? SerializeJSONProperty (state ,
! ToString (𝔽 (index )),
value ).
strP 가 undefined 이면,
"null" 을 partial 에 추가합니다.
그 밖의 경우,
strP 를 partial 에 추가합니다.
index 를 index + 1로 증가시킵니다.
partial 이 비어 있으면,
final 을 "[]" 로 설정합니다.
그 밖의 경우,
state .[[Gap]] 이 빈 문자열이면,
properties 를 partial 의 모든 문자열 요소를 인접한 각 쌍을 코드 유닛
0x002C(콤마)로 구분하여 연결한 문자열 값으로 설정합니다. 첫번째와 마지막 문자열 앞뒤에는 콤마를 삽입하지 않습니다.
final 을 문자열
연결 ("[" ,
properties , "]" )로 설정합니다.
그 밖의 경우,
separator 를 코드 유닛 0x002C(콤마), 코드 유닛 0x000A(줄 바꿈),
state .[[Indent]] 를 문자열 연결 한 값으로
설정합니다.
properties 를 partial 의 모든 문자열 요소를 인접한 각 쌍을
separator 로 구분하여 연결한 문자열 값으로 설정합니다. separator 는
첫번째와 마지막 문자열 앞뒤에는 삽입하지 않습니다.
final 을 문자열
연결 ("[" , 코드 유닛 0x000A(줄
바꿈), state .[[Indent]] ,
properties , 코드 유닛 0x000A(줄 바꿈), stepBack ,
"]" )로 설정합니다.
state .[[Stack]] 의 마지막 요소를 제거합니다.
state .[[Indent]] 를 stepBack 으로 설정합니다.
final 을 반환합니다.
참고
배열의 표현은 interval 내
+0 𝔽 (포함)에서 array.length (제외)까지의 요소만
포함합니다. 키가 array
indices 가 아닌 프로퍼티는 문자열화에서 제외됩니다. 배열은 왼쪽 대괄호로 시작하여, 요소가 콤마로
구분되고, 오른쪽 대괄호로 닫힌 형태로 문자열화됩니다.
25.5.3 JSON [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"JSON" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
26 메모리 관리
26.1 WeakRef 객체
WeakRef 는 대상 객체나 심볼을 가비지 컬렉션으로부터 보존하지 않고 참조할
때 사용되는 객체입니다. WeakRef들 은 대상 값이 가비지 컬렉션에 의해 회수되지 않았다면 해당 대상
값에 접근할 수 있도록 역참조 할 수 있습니다.
26.1.1 WeakRef 생성자
WeakRef 생성자 :
%WeakRef% 입니다.
글로벌
객체 의 "WeakRef" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 WeakRef를 생성하고 초기화합니다.
함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 WeakRef 동작을 상속하고자 하는 서브클래스
생성자 는
super 호출을 통해 WeakRef 생성자 를 호출하여,
WeakRef.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화해야 합니다.
26.1.1.1 WeakRef ( target )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
CanBeHeldWeakly (target )이
false 이면 TypeError 예외를 throw합니다.
weakRef 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%WeakRef.prototype%" , « [[WeakRefTarget]] »)로 설정합니다.
AddToKeptObjects (target )를
수행합니다.
weakRef .[[WeakRefTarget]] 를 target 으로
설정합니다.
weakRef 를 반환합니다.
26.1.2 WeakRef 생성자의 속성
WeakRef 생성자 :
26.1.2.1 WeakRef.prototype
WeakRef.prototype의 초기 값은 WeakRef 프로토타입
객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
26.1.3 WeakRef 프로토타입 객체의 속성
WeakRef 프로토타입 객체 :
%WeakRef.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[WeakRefTarget]] 내부 슬롯을 가지지 않습니다.
26.1.3.1 WeakRef.prototype.constructor
WeakRef.prototype.constructor의 초기 값은 %WeakRef% 입니다.
26.1.3.2 WeakRef.prototype.deref ( )
이 메서드는 호출 시 다음 단계들을 수행합니다:
weakRef 를 this 값으로 설정합니다.
? RequireInternalSlot (weakRef ,
[[WeakRefTarget]] )를 수행합니다.
WeakRefDeref (weakRef )를
반환합니다.
참고
WeakRef 가 target
값을 반환하고 그 값이 undefined 가 아니라면, 이 target 값은 현재
ECMAScript 코드 실행이 완료될 때까지 가비지 컬렉션되지 않아야 합니다. AddToKeptObjects
연산은 읽기 일관성이 유지되도록 보장합니다.
let target = { foo ( ) {} };
let weakRef = new WeakRef (target);
if (weakRef.deref ()) {
weakRef.deref ().foo ();
}
위 예시에서 첫 번째 deref가 undefined 로 평가되지 않는다면, 두 번째 deref도
undefined 가 될 수 없습니다.
26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"WeakRef" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
26.1.4 WeakRef 추상 연산
26.1.4.1 WeakRefDeref ( weakRef )
추상 연산 WeakRefDeref는 인자 weakRef (WeakRef )를 받아
ECMAScript 언어 값 를 반환합니다. 호출 시 다음
단계들을 수행합니다:
target 을 weakRef .[[WeakRefTarget]] 으로
설정합니다.
target 이 empty 가 아니라면,
AddToKeptObjects (target )를
수행합니다.
target 을 반환합니다.
undefined 를 반환합니다.
참고
이 추상 연산은 WeakRef.prototype.deref와는 별개로 정의되어 있으며, liveness(생존성)을 간결하게 정의할 수 있도록 하기
위함입니다.
26.1.5 WeakRef 인스턴스의 속성
WeakRef 인스턴스는 일반 객체 이며,
WeakRef 프로토타입 객체 의
프로퍼티를 상속합니다. 또한 WeakRef 인스턴스들은 [[WeakRefTarget]] 내부 슬롯을 가지고 있습니다.
26.2 FinalizationRegistry 객체
FinalizationRegistry 는 대상 객체와
심볼이 가비지 컬렉션될 때 수행되는 정리 작업의 등록과 해제를 관리하는 객체입니다.
26.2.1 FinalizationRegistry 생성자
FinalizationRegistry 생성자 :
%FinalizationRegistry% 입니다.
글로벌
객체 의 "FinalizationRegistry" 프로퍼티의 초기 값입니다.
생성자 로 호출될
때 새로운 FinalizationRegistry를 생성하고 초기화합니다.
함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생합니다.
클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 FinalizationRegistry 동작을
상속하고자 하는 서브클래스 생성자 는 super 호출을 통해
FinalizationRegistry 생성자 를 호출하여,
FinalizationRegistry.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화해야
합니다.
26.2.1.1 FinalizationRegistry ( cleanupCallback )
이 함수는 호출 시 다음 단계들을 수행합니다:
NewTarget이 undefined 이면 TypeError 예외를 throw합니다.
IsCallable (cleanupCallback )이
false 이면 TypeError 예외를 throw합니다.
finalizationRegistry 를 ? OrdinaryCreateFromConstructor (NewTarget,
"%FinalizationRegistry.prototype%" , « [[Realm]] , [[CleanupCallback]] ,
[[Cells]] »)로 설정합니다.
fn 을 활성 함수 객체 로 설정합니다.
finalizationRegistry .[[Realm]] 을
fn .[[Realm]] 로 설정합니다.
finalizationRegistry .[[CleanupCallback]] 를
HostMakeJobCallback (cleanupCallback )으로
설정합니다.
finalizationRegistry .[[Cells]] 를 새로운 빈 리스트 로 설정합니다.
finalizationRegistry 를 반환합니다.
26.2.2 FinalizationRegistry 생성자의 속성
FinalizationRegistry
생성자 :
26.2.2.1 FinalizationRegistry.prototype
FinalizationRegistry.prototype의 초기 값은 FinalizationRegistry
프로토타입 객체 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }입니다.
26.2.3 FinalizationRegistry 프로토타입 객체의 속성
FinalizationRegistry 프로토타입 객체 :
%FinalizationRegistry.prototype% 입니다.
[[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype% 입니다.
일반
객체 입니다.
[[Cells]] 와 [[CleanupCallback]] 내부 슬롯을 가지지
않습니다.
26.2.3.1 FinalizationRegistry.prototype.constructor
FinalizationRegistry.prototype.constructor의 초기 값은 %FinalizationRegistry% 입니다.
26.2.3.2 FinalizationRegistry.prototype.register (
target , heldValue [ , unregisterToken ] )
이 메서드는 호출 시 다음 단계들을 수행합니다:
finalizationRegistry 를 this 값으로 설정합니다.
? RequireInternalSlot (finalizationRegistry ,
[[Cells]] )를 수행합니다.
CanBeHeldWeakly (target )이
false 이면 TypeError 예외를 throw합니다.
SameValue (target ,
heldValue )가 true 이면 TypeError 예외를
throw합니다.
CanBeHeldWeakly (unregisterToken )이
false 이면,
unregisterToken 이 undefined 가 아니면
TypeError 예외를 throw합니다.
unregisterToken 을 empty 로 설정합니다.
cell 을 레코드 { [[WeakRefTarget]] : target , [[HeldValue]] : heldValue , [[UnregisterToken]] : unregisterToken }로
설정합니다.
cell 을 finalizationRegistry .[[Cells]] 에
추가합니다.
undefined 를 반환합니다.
참고
이 명세의 알고리즘과 정의에 따르면, cell .[[HeldValue]] 는
finalizationRegistry .[[Cells]] 에 cell 이
포함되어 있을 때 live 입니다. 그러나 이는 반드시 cell .[[UnregisterToken]] 이나 cell .[[Target]] 이 live 임을 의미하지는 않습니다. 예를 들어,
객체를 자기 자신을 unregister token으로 등록해도 그 객체가 영원히 살아있는 것은 아닙니다.
26.2.3.3 FinalizationRegistry.prototype.unregister (
unregisterToken )
이 메서드는 호출 시 다음 단계들을 수행합니다:
finalizationRegistry 를 this 값으로 설정합니다.
? RequireInternalSlot (finalizationRegistry ,
[[Cells]] )를 수행합니다.
CanBeHeldWeakly (unregisterToken )이
false 이면 TypeError 예외를 throw합니다.
removed 를 false 로 설정합니다.
finalizationRegistry .[[Cells]] 의 각 레코드 { [[WeakRefTarget]] , [[HeldValue]] ,
[[UnregisterToken]] } cell 에 대해,
cell .[[UnregisterToken]] 이
empty 가 아니고 SameValue (cell .[[UnregisterToken]] , unregisterToken )가
true 이면,
cell 을 finalizationRegistry .[[Cells]] 에서 제거합니다.
removed 를 true 로 설정합니다.
removed 를 반환합니다.
26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값
"FinalizationRegistry" 입니다.
이 프로퍼티의 속성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }입니다.
26.2.4 FinalizationRegistry 인스턴스의 속성
FinalizationRegistry
인스턴스는 일반
객체 이며, FinalizationRegistry
프로토타입 객체 의 프로퍼티를 상속합니다. 또한 FinalizationRegistry 인스턴스들은
[[Cells]] 및 [[CleanupCallback]] 내부 슬롯을 가지고
있습니다.
27 제어 추상화 객체
27.1 반복
27.1.1 공통 반복 인터페이스
인터페이스는 특정 명세와 일치하는 프로퍼티
키 들의 집합입니다. 객체가 인터페이스의 명세에 따라 모든 프로퍼티를 제공하면 그 인터페이스를 준수 한다고 합니다.
인터페이스는 별도의 객체로 표현되지 않습니다. 어떤 인터페이스를 준수하는 여러 개의 구현 객체가 있을 수 있습니다. 하나의 객체가 여러 인터페이스를 준수할 수도 있습니다.
27.1.1.1 이터러블 인터페이스
이터러블
인터페이스 는 표
82 에 설명된 프로퍼티를 포함합니다:
표 82: 이터러블 인터페이스 필수 프로퍼티
27.1.1.2 이터레이터 인터페이스
이터레이터
인터페이스 를 구현한 객체는 표
83 의 프로퍼티를 반드시 포함해야 합니다. 이러한 객체는 표 84 의 프로퍼티도 구현할
수 있습니다.
표 83: 이터레이터 인터페이스 필수 프로퍼티
참고 1
next 함수에 인자를 전달할 수 있지만, 그 해석과 유효성은 대상 이터레이터에 따라 다릅니다. for-of 문 및 기타 일반적인
이터레이터 사용자들은 인자를 전달하지 않으므로, 이러한 방식으로 사용될 것으로 예상되는 이터레이터 객체는 인자 없이 호출되는 경우에도 대응할 수 있어야
합니다.
표 84: 이터레이터 인터페이스 선택적 프로퍼티
참고 2
일반적으로 이러한 메서드를 호출하기 전에 존재 여부를 확인하는 것이 좋습니다. ECMAScript 언어의 특정 기능(예:
for-of, yield*, 배열 구조분해)은 존재 여부를 확인한 후에 이런
메서드를 호출합니다. 이터러블 객체 를 인자로 받는 대부분의
ECMAScript 라이브러리 함수도 조건부로 이를 호출합니다.
27.1.1.3 비동기 반복자 인터페이스
비동기 반복자 인터페이스 에는 표 85 에 설명된 속성이 포함됩니다:
표 85: 비동기 반복자 인터페이스 필수 속성
27.1.1.4 비동기 반복자 인터페이스
비동기 반복자 인터페이스 를 구현하는 객체는 표 86 의 속성을 포함해야 합니다. 이러한 객체는
표 87 의 속성도 구현할 수 있습니다.
표 86: 비동기 반복자 인터페이스 필수 속성
참고 1
next 함수에 인자를 전달할 수 있으나, 해당 인자의 해석 및 유효성은 대상 비동기 반복자에 따라 달라집니다.
for-await-of 문 및 기타 일반적인 비동기 반복자 사용자는 인자를
전달하지 않으므로, 이러한 방식으로 사용될 것으로 예상되는 비동기 반복자 객체는 인자 없이 호출되는 경우를 처리할 준비가 되어 있어야 합니다.
표 87: 비동기 반복자 인터페이스 선택적 속성
속성
값
요구 사항
"return"
IteratorResult
객체 에 대한 프로미스를 반환하는 함수
프로미스가 이행될 때, IteratorResult
인터페이스 를 준수하는 객체로 이행되어야 합니다. 이 메서드를 호출하면
비동기 반복자
객체 에게 더 이상 next 메서드를 호출할 의도가 없음을
알립니다. 반환된 프로미스는 일반적으로 IteratorResult
객체 의 "done" 속성이
true 이고, "value" 속성이
return 메서드의 인자 값인 객체로 이행됩니다. 단, 이 요구 사항은 강제되지 않습니다.
또한, 이행 값으로 제공되는 IteratorResult
객체 는 프로미스(또는 "thenable")가 아닌 값을 가진
"value" 속성을 가져야 합니다. 인자 값이 일반적으로 사용되는 방식이라면, 거부된
프로미스일 경우 동일한 이유로 거부된 프로미스를 반환해야 하며, 이행된 프로미스일 경우 이행 값이 반환된 프로미스의
"value" 속성 값으로 사용되어야 합니다. 하지만 이러한 요구 사항도 강제되지
않습니다.
"throw"
IteratorResult
객체 에 대한 프로미스를 반환하는 함수
프로미스가 이행될 때, IteratorResult
인터페이스 를 준수하는 객체로 이행되어야 합니다. 이 메서드를 호출하면
비동기 반복자
객체 에게 호출자가 오류 조건을 감지했음을 알립니다. 인자는 오류 조건을 식별하는
데 사용될 수 있으며 일반적으로 예외 객체입니다. 일반적인 응답은 전달된 인자 값으로 거부되는 프로미스를 반환하는
것입니다.
반환된 프로미스가 이행되는 경우, IteratorResult
객체 이행 값에는 일반적으로 "done" 속성이
true 이고, "value" 속성 값은 프로미스(또는
"thenable")가 아닌 값이어야 합니다. 단, 이 요구 사항은 강제되지 않습니다.
참고 2
일반적으로 이러한 메서드를 호출하는 쪽에서는 존재 여부를 확인한 후 호출해야 합니다.
for-await-of 및 yield*와 같은 일부
ECMAScript 언어 기능은 존재 여부 확인 후 이 메서드를 호출합니다.
27.1.1.5 반복 결과 인터페이스
IteratorResult
인터페이스 에는 표 88 에
나열된 속성이 포함됩니다:
표 88: IteratorResult 인터페이스 속성
속성
값
요구 사항
"done"
불리언 값
이것은 반복자 의
next 메서드 호출 결과 상태입니다. 반복자 의 끝에 도달하면
"done" 은 true 입니다. 끝에 도달하지 않았다면
"done" 은 false 이고 값이 제공됩니다.
"done" 속성(자신 또는 상속된)이 존재하지 않으면
false 값을 갖는 것으로 간주합니다.
"value"
ECMAScript 언어
값
done이 false 인 경우, 현재 반복 요소 값입니다. done이
true 이면 반복자 의 반환 값(있다면)입니다.
반복자 가 반환 값을 제공하지 않는
경우, "value" 는 undefined 입니다. 이 경우,
명시적으로 "value" 속성을 상속받지 않았다면, 해당 속성은 적합한 객체에서 생략될 수
있습니다.
27.1.2 반복자 헬퍼 객체
반복자 헬퍼 객체 는 특정 소스 일반 객체 의 지연
변환을 나타내는 반복자 객체 입니다. 반복자 헬퍼 객체를 위한 명명된 생성자 는 없습니다. 대신, 반복자
헬퍼 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.
27.1.2.1 %IteratorHelperPrototype% 객체
%IteratorHelperPrototype% 객체:
27.1.2.1.1 %IteratorHelperPrototype%.next ( )
? GeneratorResume (this
값, undefined , "Iterator Helper" )를 반환합니다.
27.1.2.1.2 %IteratorHelperPrototype%.return ( )
O 를 this 값으로 둡니다.
? RequireInternalSlot (O ,
[[UnderlyingIterator]] )를 수행합니다.
Assert : O 는 [[GeneratorState]] 내부 슬롯을 가집니다.
만약 O .[[GeneratorState]] 가
suspended-start 라면,
O .[[GeneratorState]] 를
completed 로 설정합니다.
참고: 생성기가 완료 상태에 들어가면 다시 돌아오지 않으며, 관련된 실행 컨텍스트 가 다시 재개되지
않습니다. O 와 관련된 모든 실행 상태는 이 시점에서 폐기될 수 있습니다.
? IteratorClose (O .[[UnderlyingIterator]] , NormalCompletion (unused ))를
수행합니다.
CreateIteratorResultObject (undefined ,
true )를 반환합니다.
C 를 ReturnCompletion (undefined )으로
둡니다.
? GeneratorResumeAbrupt (O ,
C , "Iterator Helper" )를 반환합니다.
27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag%
]
%Symbol.toStringTag% 속성의 초기 값은 문자열
"Iterator Helper" 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
true }입니다.
27.1.3 반복자 객체
27.1.3.1 반복자 생성자
Iterator 생성자 :
%Iterator% 입니다.
전역
객체 의 "Iterator" 속성의 초기 값입니다.
서브클래싱이 가능하도록 설계되었습니다. 클래스 정의의 extends 절의 값으로 사용할 수 있습니다.
27.1.3.1.1 Iterator ( )
이 함수는 호출될 때 다음 단계들을 수행합니다:
NewTarget이 undefined 또는 활성 함수 객체 인 경우,
TypeError 예외를 발생시킵니다.
? OrdinaryCreateFromConstructor (NewTarget,
"%Iterator.prototype%" )를 반환합니다.
27.1.3.2 반복자 생성자의 속성
Iterator 생성자 :
27.1.3.2.1 Iterator.from ( O )
iteratorRecord 를 ? GetIteratorFlattenable (O ,
iterate-string-primitives )로 둡니다.
hasInstance 를 ? OrdinaryHasInstance (%Iterator% ,
iteratorRecord .[[Iterator]] )로 둡니다.
hasInstance 가 true 이면,
iteratorRecord .[[Iterator]] 를 반환합니다.
wrapper 를 OrdinaryObjectCreate (%WrapForValidIteratorPrototype% ,
« [[Iterated]] »)로 둡니다.
wrapper .[[Iterated]] 에
iteratorRecord 를 설정합니다.
wrapper 를 반환합니다.
27.1.3.2.1.1 %WrapForValidIteratorPrototype% 객체
%WrapForValidIteratorPrototype% 객체:
27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next
( )
O 를 this 값으로 둡니다.
? RequireInternalSlot (O ,
[[Iterated]] )를 수행합니다.
iteratorRecord 를 O .[[Iterated]] 로 둡니다.
? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] )를 반환합니다.
27.1.3.2.1.1.2
%WrapForValidIteratorPrototype%.return ( )
O 를 this 값으로 둡니다.
? RequireInternalSlot (O ,
[[Iterated]] )를 수행합니다.
iterator 를 O .[[Iterated]] .[[Iterator]] 로 둡니다.
Assert : iterator
객체임을 확인합니다 .
returnMethod 를 ? GetMethod (iterator ,
"return" )로 둡니다.
returnMethod 가 undefined 이면,
CreateIteratorResultObject (undefined ,
true )를 반환합니다.
? Call (returnMethod ,
iterator )를 반환합니다.
27.1.3.2.2 Iterator.prototype
Iterator.prototype의 초기 값은 Iterator prototype
객체 입니다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] :
false , [[Configurable]] :
false }입니다.
27.1.4 반복자 프로토타입 객체의 속성
반복자 프로토타입 객체 :
참고
이 명세에서 반복자 인터페이스를 구현하는 모든 객체는 %Iterator.prototype%을 상속합니다. ECMAScript 코드 역시
%Iterator.prototype%에서 상속하는 객체를 정의할 수 있습니다. %Iterator.prototype%은 모든 반복자 객체에 적용 가능한 추가
메서드를 제공할 수 있는 장소입니다.
다음 표현식은 ECMAScript 코드에서 %Iterator.prototype% 객체에 접근하는 한 가지 방법입니다:
Object .getPrototypeOf (Object .getPrototypeOf ([][Symbol .iterator ]()))
27.1.4.1 Iterator.prototype.constructor
Iterator.prototype.constructor는 접근자 속성 이며, 속성은 { [[Enumerable]] : false , [[Configurable]] : true }입니다. [[Get]] 및 [[Set]] 속성은 다음과 같이 정의됩니다:
27.1.4.1.1 get Iterator.prototype.constructor
[[Get]] 속성 값은 인자가 필요 없는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:
%Iterator% 를 반환합니다.
27.1.4.1.2 set Iterator.prototype.constructor
[[Set]] 속성 값은 v 인자를 받는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:
? SetterThatIgnoresPrototypeProperties (this
값, %Iterator.prototype% ,
"constructor" , v )를 수행합니다.
undefined 를 반환합니다.
참고
대부분의 내장 프로토타입에 있는 "constructor" 속성과 달리, 웹 호환성을 위해 이 속성은 반드시 접근자여야
합니다.
27.1.4.2 Iterator.prototype.drop ( limit )
이 메서드는 호출 시 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
numLimit 를 Completion (ToNumber (limit ))로 둡니다.
IfAbruptCloseIterator (numLimit ,
iterated )를 수행합니다.
numLimit 가 NaN 이면,
error 를 ThrowCompletion (새로 생성한
RangeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
integerLimit 를 ! ToIntegerOrInfinity (numLimit )로
둡니다.
integerLimit < 0이면,
error 를 ThrowCompletion (새로 생성한
RangeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
closure 를 iterated 와 integerLimit 를 캡처하고 호출 시 다음 단계를
수행하는 파라미터 없는 새로운 Abstract Closure 로 둡니다:
remaining 을 integerLimit 로 둡니다.
remaining > 0인 동안 반복,
remaining ≠ +∞이면,
remaining 을 remaining - 1로 설정합니다.
next 를 ? IteratorStep (iterated )로
둡니다.
next 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
completion 을 Completion (Yield (value ))로
둡니다.
IfAbruptCloseIterator (completion ,
iterated )를 수행합니다.
result 를 CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »)로 둡니다.
result .[[UnderlyingIterator]] 를
iterated 로 설정합니다.
result 를 반환합니다.
27.1.4.3 Iterator.prototype.every ( predicate )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (predicate )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, true 를
반환합니다.
result 를 Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »))로 둡니다.
IfAbruptCloseIterator (result ,
iterated )를 수행합니다.
ToBoolean (result )가
false 이면, ? IteratorClose (iterated ,
NormalCompletion (false ))를
반환합니다.
counter 를 counter + 1로 설정합니다.
27.1.4.4 Iterator.prototype.filter ( predicate )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (predicate )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
closure 를 iterated 와 predicate 를 캡처하고 호출 시 다음 단계를 수행하는
파라미터 없는 새로운 Abstract Closure 로 둡니다:
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
selected 를 Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »))로
둡니다.
IfAbruptCloseIterator (selected ,
iterated )를 수행합니다.
ToBoolean (selected )
가 true 이면,
completion 을 Completion (Yield (value ))로
둡니다.
IfAbruptCloseIterator (completion ,
iterated )를 수행합니다.
counter 를 counter + 1로 설정합니다.
result 를 CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »)로 둡니다.
result .[[UnderlyingIterator]] 를
iterated 로 설정합니다.
result 를 반환합니다.
27.1.4.5 Iterator.prototype.find ( predicate )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (predicate )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면,
undefined 를 반환합니다.
result 를 Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »))로 둡니다.
IfAbruptCloseIterator (result ,
iterated )를 수행합니다.
ToBoolean (result )가
true 이면, ? IteratorClose (iterated ,
NormalCompletion (value ))를
반환합니다.
counter 를 counter + 1로 설정합니다.
27.1.4.6 Iterator.prototype.flatMap ( mapper )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (mapper )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
closure 를 iterated 와 mapper 를 캡처하고 호출 시 다음 단계를 수행하는
파라미터 없는 새로운 Abstract Closure 로 둡니다:
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
mapped 를 Completion (Call (mapper ,
undefined , « value , 𝔽 (counter ) »))로
둡니다.
IfAbruptCloseIterator (mapped ,
iterated )를 수행합니다.
innerIterator 를 Completion (GetIteratorFlattenable (mapped ,
reject-primitives ))로 둡니다.
IfAbruptCloseIterator (innerIterator ,
iterated )를 수행합니다.
innerAlive 를 true 로 둡니다.
innerAlive 가 true 인 동안 반복,
innerValue 를 Completion (IteratorStepValue (innerIterator ))로
둡니다.
IfAbruptCloseIterator (innerValue ,
iterated )를 수행합니다.
innerValue 가 done 이면,
innerAlive 를 false 로
설정합니다.
그렇지 않으면,
completion 을 Completion (Yield (innerValue ))로
둡니다.
completion 이 abrupt
completion 이면,
backupCompletion 을 Completion (IteratorClose (innerIterator ,
completion ))로 둡니다.
IfAbruptCloseIterator (backupCompletion ,
iterated )를 수행합니다.
? IteratorClose (iterated ,
completion )를 반환합니다.
counter 를 counter + 1로 설정합니다.
result 를 CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »)로 둡니다.
result .[[UnderlyingIterator]] 를
iterated 로 설정합니다.
result 를 반환합니다.
27.1.4.7 Iterator.prototype.forEach ( procedure )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (procedure )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면,
undefined 를 반환합니다.
result 를 Completion (Call (procedure ,
undefined , « value , 𝔽 (counter ) »))로 둡니다.
IfAbruptCloseIterator (result ,
iterated )를 수행합니다.
counter 를 counter + 1로 설정합니다.
27.1.4.8 Iterator.prototype.map ( mapper )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (mapper )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
closure 를 iterated 와 mapper 를 캡처하고 호출 시 다음 단계를 수행하는
파라미터 없는 새로운 Abstract Closure 로 둡니다:
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
mapped 를 Completion (Call (mapper ,
undefined , « value , 𝔽 (counter ) »))로
둡니다.
IfAbruptCloseIterator (mapped ,
iterated )를 수행합니다.
completion 을 Completion (Yield (mapped ))로
둡니다.
IfAbruptCloseIterator (completion ,
iterated )를 수행합니다.
counter 를 counter + 1로 설정합니다.
result 를 CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »)로 둡니다.
result .[[UnderlyingIterator]] 를
iterated 로 설정합니다.
result 를 반환합니다.
27.1.4.9 Iterator.prototype.reduce ( reducer [ ,
initialValue ] )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (reducer )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
initialValue 가 존재하지 않으면,
accumulator 를 ? IteratorStepValue (iterated )로
둡니다.
accumulator 가 done 이면,
TypeError 예외를 발생시킵니다.
counter 를 1로 둡니다.
그렇지 않으면,
accumulator 를 initialValue 로 둡니다.
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, accumulator 를
반환합니다.
result 를 Completion (Call (reducer ,
undefined , « accumulator , value ,
𝔽 (counter ) »))로 둡니다.
IfAbruptCloseIterator (result ,
iterated )를 수행합니다.
accumulator 를 result 로 설정합니다.
counter 를 counter + 1로 설정합니다.
27.1.4.10 Iterator.prototype.some ( predicate )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
IsCallable (predicate )가
false 이면,
error 를 ThrowCompletion (새로 생성한
TypeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
counter 를 0으로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, false 를
반환합니다.
result 를 Completion (Call (predicate ,
undefined , « value , 𝔽 (counter ) »))로 둡니다.
IfAbruptCloseIterator (result ,
iterated )를 수행합니다.
ToBoolean (result )가
true 이면, ? IteratorClose (iterated ,
NormalCompletion (true ))를
반환합니다.
counter 를 counter + 1로 설정합니다.
27.1.4.11 Iterator.prototype.take ( limit )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false }로 둡니다.
numLimit 를 Completion (ToNumber (limit ))로 둡니다.
IfAbruptCloseIterator (numLimit ,
iterated )를 수행합니다.
numLimit 이 NaN 이면,
error 를 ThrowCompletion (새로 생성한
RangeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
integerLimit 를 ! ToIntegerOrInfinity (numLimit )로
둡니다.
integerLimit < 0이면,
error 를 ThrowCompletion (새로 생성한
RangeError 객체)로 둡니다.
? IteratorClose (iterated ,
error )를 반환합니다.
iterated 를 ? GetIteratorDirect (O )로 설정합니다.
closure 를 iterated 와 integerLimit 를 캡처하고 호출 시 다음 단계를
수행하는 파라미터 없는 새로운 Abstract Closure 로 둡니다:
remaining 을 integerLimit 로 둡니다.
반복,
remaining = 0이면,
? IteratorClose (iterated ,
ReturnCompletion (undefined ))를
반환합니다.
remaining ≠ +∞이면,
remaining 을 remaining - 1로 설정합니다.
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, ReturnCompletion (undefined )를
반환합니다.
completion 을 Completion (Yield (value ))로
둡니다.
IfAbruptCloseIterator (completion ,
iterated )를 수행합니다.
result 를 CreateIteratorFromClosure (closure ,
"Iterator Helper" , %IteratorHelperPrototype% ,
« [[UnderlyingIterator]] »)로 둡니다.
result .[[UnderlyingIterator]] 를
iterated 로 설정합니다.
result 를 반환합니다.
27.1.4.12 Iterator.prototype.toArray ( )
이 메서드는 호출될 때 다음 단계를 수행합니다:
O 를 this 값으로 둡니다.
O 가 객체가 아니면 , TypeError
예외를 발생시킵니다.
iterated 를 ? GetIteratorDirect (O )로 둡니다.
items 를 새로운 빈 List 로 둡니다.
반복,
value 를 ? IteratorStepValue (iterated )로
둡니다.
value 가 done 이면, CreateArrayFromList (items )를
반환합니다.
items 에 value 를 추가합니다.
27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )
이 함수는 호출될 때 다음 단계를 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 속성 값은 "[Symbol.iterator]" 입니다.
27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]
Iterator.prototype[%Symbol.toStringTag%]는 접근자 속성 이며, 속성은 { [[Enumerable]] : false , [[Configurable]] : true }입니다. [[Get]] 및 [[Set]] 속성은 다음과 같이 정의됩니다:
27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]
[[Get]] 속성 값은 인자가 필요 없는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:
"Iterator" 를 반환합니다.
27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]
[[Set]] 속성 값은 v 인자를 받는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:
? SetterThatIgnoresPrototypeProperties (this
값, %Iterator.prototype% ,
%Symbol.toStringTag% ,
v )를 수행합니다.
undefined 를 반환합니다.
참고
대부분의 내장 프로토타입에 있는 %Symbol.toStringTag% 속성과 달리, 웹
호환성을 위해 이 속성은 반드시 접근자여야 합니다.
27.1.5 %AsyncIteratorPrototype% 객체
%AsyncIteratorPrototype% 객체:
참고
이 명세에서 비동기 반복자 인터페이스를 구현하는 모든 객체는 %AsyncIteratorPrototype%을 상속합니다. ECMAScript 코드 역시
%AsyncIteratorPrototype%에서 상속하는 객체를 정의할 수 있습니다. %AsyncIteratorPrototype% 객체는 모든 비동기 반복자
객체에 적용 가능한 추가 메서드를 제공할 수 있는 장소입니다.
27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )
이 함수는 호출될 때 다음 단계를 수행합니다:
this 값을 반환합니다.
이 함수의 "name" 속성 값은 "[Symbol.asyncIterator]" 입니다.
27.1.6 동기 반복자로부터 생성된 비동기 반복자 객체
동기 반복자로부터 생성된 비동기 반복자 객체 는 특정
동기 반복자 를 적응하는 비동기 반복자 입니다. 동기 반복자로부터 생성된 비동기 반복자 객체는
ECMAScript 코드에서 직접 접근할 수 없습니다. 동기 반복자로부터 생성된 비동기 반복자 객체를 위한 명명된 생성자 는 없습니다. 대신, 동기 반복자로부터 생성된 비동기 반복자
객체는 필요에 따라 CreateAsyncFromSyncIterator 추상
연산에 의해 생성됩니다.
27.1.6.1 CreateAsyncFromSyncIterator (
syncIteratorRecord )
추상 연산 CreateAsyncFromSyncIterator는 syncIteratorRecord (Iterator
Record )를 인자로 받아 Iterator Record 를 반환합니다.
이는 동기 Iterator Record 로부터 비동기 Iterator
Record 를 생성하는 데 사용됩니다. 호출될 때 다음 단계를 수행합니다:
asyncIterator 를 OrdinaryObjectCreate (%AsyncFromSyncIteratorPrototype% ,
« [[SyncIteratorRecord]] »)로 둡니다.
asyncIterator .[[SyncIteratorRecord]] 에
syncIteratorRecord 를 설정합니다.
nextMethod 를 ! Get (asyncIterator ,
"next" )로 둡니다.
iteratorRecord 를 Iterator Record { [[Iterator]] : asyncIterator , [[NextMethod]] : nextMethod , [[Done]] : false }로 둡니다.
iteratorRecord 를 반환합니다.
27.1.6.2 %AsyncFromSyncIteratorPrototype% 객체
%AsyncFromSyncIteratorPrototype% 객체:
27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [
value ] )
O 를 this 값으로 둡니다.
Assert : O 는 객체 이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 둡니다.
syncIteratorRecord 를 O .[[SyncIteratorRecord]] 로 둡니다.
value 가 존재하면,
result 를 Completion (IteratorNext (syncIteratorRecord ,
value ))로 둡니다.
그렇지 않으면,
result 를 Completion (IteratorNext (syncIteratorRecord ))로
둡니다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행합니다.
AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
true )를 반환합니다.
27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [
value ] )
O 를 this 값으로 둡니다.
Assert : O 는 객체 이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 둡니다.
syncIteratorRecord 를 O .[[SyncIteratorRecord]] 로 둡니다.
syncIterator 를 syncIteratorRecord .[[Iterator]] 로 둡니다.
return 을 Completion (GetMethod (syncIterator ,
"return" ))로 둡니다.
IfAbruptRejectPromise (return ,
promiseCapability )를 수행합니다.
return 이 undefined 이면,
iteratorResult 를 CreateIteratorResultObject (value ,
true )로 둡니다.
! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »)를 수행합니다.
promiseCapability .[[Promise]] 를
반환합니다.
value 가 존재하면,
result 를 Completion (Call (return ,
syncIterator , « value »))로 둡니다.
그렇지 않으면,
result 를 Completion (Call (return ,
syncIterator ))로 둡니다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행합니다.
result 가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] , undefined , « 새로
생성한 TypeError 객체 »)를 수행합니다.
promiseCapability .[[Promise]] 를
반환합니다.
AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
false )를 반환합니다.
27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [
value ] )
참고
O 를 this 값으로 둡니다.
Assert : O 는 객체 이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
promiseCapability 를 ! NewPromiseCapability (%Promise% )로 둡니다.
syncIteratorRecord 를 O .[[SyncIteratorRecord]] 로 둡니다.
syncIterator 를 syncIteratorRecord .[[Iterator]] 로 둡니다.
throw 를 Completion (GetMethod (syncIterator ,
"throw" ))로 둡니다.
IfAbruptRejectPromise (throw ,
promiseCapability )를 수행합니다.
throw 가 undefined 이면,
참고: syncIterator 에 throw 메서드가 없다면, 정리 기회를 주기 위해
닫아야 하며 그 후 capability를 거부합니다.
closeCompletion 을 NormalCompletion (empty )로
둡니다.
result 를 Completion (IteratorClose (syncIteratorRecord ,
closeCompletion ))로 둡니다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행합니다.
참고: 다음 단계는 프로토콜 위반을 나타내기 위해 TypeError 를 발생시킵니다:
syncIterator 에 throw 메서드가 없습니다.
참고: syncIterator 를 닫을 때 예외가 발생하지 않으면 그 결과는 무시됩니다(거부된 프로미스를
반환해도).
! Call (promiseCapability .[[Reject]] , undefined , « 새로
생성한 TypeError 객체 »)를 수행합니다.
promiseCapability .[[Promise]] 를
반환합니다.
value 가 존재하면,
result 를 Completion (Call (throw ,
syncIterator , « value »))로 둡니다.
그렇지 않으면,
result 를 Completion (Call (throw ,
syncIterator ))로 둡니다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행합니다.
result 가 객체가 아니면 ,
! Call (promiseCapability .[[Reject]] , undefined , « 새로
생성한 TypeError 객체 »)를 수행합니다.
promiseCapability .[[Promise]] 를
반환합니다.
AsyncFromSyncIteratorContinuation (result ,
promiseCapability , syncIteratorRecord ,
true )를 반환합니다.
27.1.6.3 동기 반복자로부터 생성된 비동기 반복자 인스턴스의 속성
동기 반복자로부터 생성된 반복자 인스턴스는 일반
객체 이며, %AsyncFromSyncIteratorPrototype%
내재 객체에서 속성을 상속합니다. 동기 반복자로부터 생성된 반복자 인스턴스는 표 89 에 나열된 내부
슬롯을 가지고 생성됩니다.
표 89: 동기 반복자 인스턴스의 내부 슬롯
27.1.6.4 AsyncFromSyncIteratorContinuation ( result ,
promiseCapability , syncIteratorRecord , closeOnRejection )
추상 연산 AsyncFromSyncIteratorContinuation은 result (객체),
promiseCapability (내재 %Promise% 의 PromiseCapability Record ),
syncIteratorRecord (Iterator Record ),
closeOnRejection (불리언)를 인자로 받고 프로미스를 반환합니다. 호출될 때 다음 단계를 수행합니다:
참고: promiseCapability 가 내재 %Promise% 에서
파생되므로, 아래에서 promiseCapability .[[Reject]] 호출로 인해
IfAbruptRejectPromise 사용 시
예외가 발생하지 않습니다.
done 을 Completion (IteratorComplete (result ))로
둡니다.
IfAbruptRejectPromise (done ,
promiseCapability )를 수행합니다.
value 를 Completion (IteratorValue (result ))로 둡니다.
IfAbruptRejectPromise (value ,
promiseCapability )를 수행합니다.
valueWrapper 를 Completion (PromiseResolve (%Promise% ,
value ))로 둡니다.
valueWrapper 가 abrupt
completion 이고 done 이 false 이며
closeOnRejection 이 true 이면,
valueWrapper 를 Completion (IteratorClose (syncIteratorRecord ,
valueWrapper ))로 둡니다.
IfAbruptRejectPromise (valueWrapper ,
promiseCapability )를 수행합니다.
unwrap 를 done 을 캡처하고 호출 시 다음 단계를 수행하는 파라미터 (v )를 가지는
새로운 Abstract Closure 로 둡니다:
CreateIteratorResultObject (v ,
done )를 반환합니다.
onFulfilled 를 CreateBuiltinFunction (unwrap ,
1, "" , « »)로 둡니다.
참고: onFulfilled 는 IteratorResult
객체 의 "value" 속성 처리 시, 그 값이 프로미스라면 기다렸다가 새
"unwrapped" IteratorResult 객체 로 재포장하기
위해 사용됩니다.
done 이 true 이거나 closeOnRejection 이
false 이면,
onRejected 를 undefined 로 둡니다.
그 밖의 경우,
closeIterator 를 파라미터 (error )를 가지며
syncIteratorRecord 를 캡처하는 새로운 Abstract Closure 로 둡니다.
호출 시 다음 단계를 수행합니다:
? IteratorClose (syncIteratorRecord ,
ThrowCompletion (error ))를
반환합니다.
onRejected 를 CreateBuiltinFunction (closeIterator ,
1, "" , « »)로 둡니다.
참고: onRejected 는 반복자 가
산출하는 IteratorResult
객체 의 "value" 속성이 거부된 프로미스일 때 반복자를
닫는 데 사용됩니다.
PerformPromiseThen (valueWrapper ,
onFulfilled , onRejected , promiseCapability )를 수행합니다.
promiseCapability .[[Promise]] 를 반환합니다.
27.2 프라미스 객체
프라미스(Promise)는 지연된(그리고 비동기적일 수 있는) 계산의 최종 결과를 임시로 나타내기 위해 사용되는 객체입니다.
모든 프라미스는 세 가지 상호 배타적인 상태 중 하나입니다: 이행됨(fulfilled) , 거부됨(rejected) , 그리고
대기중(pending) :
프라미스 p가 이행됨(fulfilled) 상태라면 p.then(f, r)은 즉시 Job 을 큐에 등록하여 함수 f를 호출합니다.
프라미스 p가 거부됨(rejected) 상태라면 p.then(f, r)은 즉시 Job 을 큐에 등록하여 함수 r을 호출합니다.
프라미스가 대기중(pending) 상태라면, 이행됨도 거부됨도 아닙니다.
프라미스는 대기중이 아닌 경우, 즉 이행되었거나 거부된 경우 정산됨(settled) 상태라고 합니다.
프라미스는 정산되었거나, 다른 프라미스의 상태와 “연동되어(lock in)”있는 경우 해결됨(resolved) 이라고 합니다. 해결된 프라미스를 다시 해결하거나
거부하려고 해도 아무런 효과가 없습니다. 미해결(unresolved) 프라미스는 해결되지 않은 경우이며, 항상 대기중(pending) 상태입니다. 해결된 프라미스는
대기중, 이행됨, 또는 거부됨 중 하나일 수 있습니다.
27.2.1 프라미스 추상 연산
27.2.1.1 PromiseCapability 레코드
PromiseCapability 레코드 는 프라미스 또는
프라미스와 유사한 객체와 해당 프라미스를 해결하거나 거부할 수 있는 함수들을 캡슐화하기 위해 사용되는 레코드 값입니다.
PromiseCapability 레코드는 NewPromiseCapability 추상 연산에 의해
생성됩니다.
PromiseCapability 레코드는 표 90 에 나열된
필드를 가집니다.
표 90: PromiseCapability 레코드 의
필드
필드 이름
값
의미
[[Promise]]
객체(Object)
프라미스로 사용할 수 있는 객체입니다.
[[Resolve]]
함수 객체
해당 프라미스를 해결하는 데 사용되는 함수입니다.
[[Reject]]
함수 객체
해당 프라미스를 거부하는 데 사용되는 함수입니다.
27.2.1.1.1 IfAbruptRejectPromise ( value ,
capability )
IfAbruptRejectPromise는 PromiseCapability 레코드 를 사용하는
알고리즘 단계의 축약 표현입니다. 다음과 같은 알고리즘 단계:
IfAbruptRejectPromise (value ,
capability ).
다음과 같은 의미와 같습니다:
Assert : value 는 Completion
Record 입니다.
value 가 abrupt
completion 이면,
? Call (capability .[[Reject]] , undefined , «
value .[[Value]] »)를 수행합니다.
capability .[[Promise]] 를 반환합니다.
그 밖의 경우,
value 를 ! value 로 설정합니다.
27.2.1.2 PromiseReaction 레코드
PromiseReaction 레코드 는 주어진 값으로
프라미스가 해결되거나 거부될 때 어떻게 반응할지 정보를 저장하는 레코드
값입니다. PromiseReaction 레코드는 PerformPromiseThen 추상 연산에 의해 생성되며,
Abstract Closure 가 NewPromiseReactionJob 을 반환할 때 사용됩니다.
PromiseReaction 레코드는 표 91 에 나열된 필드를 가집니다.
표 91: PromiseReaction 레코드 의 필드
필드 이름
값
의미
[[Capability]]
PromiseCapability
레코드 또는 undefined
이 레코드가 반응 핸들러를 제공하는 프라미스의 capability입니다.
[[Type]]
fulfill 또는 reject
[[Handler]] 가 empty 일 때,
정산 유형(type)에 따른 동작을 허용하기 위해 사용됩니다.
[[Handler]]
JobCallback 레코드
또는 empty
들어오는 값에 적용되는 함수이며, 그 반환값에 따라 파생 프라미스의 동작이 결정됩니다. [[Handler]] 가 empty 일 경우,
[[Type]] 값에 따라 동작하는 함수가 대신 사용됩니다.
27.2.1.3 CreateResolvingFunctions ( promise )
CreateResolvingFunctions 추상 연산은 promise (프라미스)를 인자로 받고, [[Resolve]] (함수 객체 )와 [[Reject]] (함수 객체 ) 필드를 가진 레코드 값을 반환합니다. 호출 시 아래와
같은 단계를 수행합니다:
alreadyResolved 를 레코드 { [[Value]] : false }로 둡니다.
stepsResolve 를 Promise Resolve
Functions 에 정의된 알고리즘 단계로 둡니다.
lengthResolve 를 Promise Resolve
Functions 의 함수 정의에서 비옵션 파라미터의 개수로 둡니다.
resolve 를 CreateBuiltinFunction (stepsResolve ,
lengthResolve , "" , « [[Promise]] , [[AlreadyResolved]] »)로 둡니다.
resolve .[[Promise]] 에 promise 를 설정합니다.
resolve .[[AlreadyResolved]] 에
alreadyResolved 를 설정합니다.
stepsReject 를 Promise Reject
Functions 에 정의된 알고리즘 단계로 둡니다.
lengthReject 를 Promise Reject
Functions 의 함수 정의에서 비옵션 파라미터의 개수로 둡니다.
reject 를 CreateBuiltinFunction (stepsReject ,
lengthReject , "" , « [[Promise]] , [[AlreadyResolved]] »)로 둡니다.
reject .[[Promise]] 에 promise 를 설정합니다.
reject .[[AlreadyResolved]] 에
alreadyResolved 를 설정합니다.
레코드 { [[Resolve]] : resolve , [[Reject]] : reject }를 반환합니다.
27.2.1.3.1 Promise Reject Functions
프라미스 reject 함수는 [[Promise]] 와 [[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수입니다.
프라미스 reject 함수가 reason 인자와 함께 호출되면 다음 단계를 수행합니다:
F 를 활성 함수 객체 로 둡니다.
Assert : F 는 [[Promise]] 내부 슬롯을 가지고 있으며, 그 값은 객체 입니다.
promise 를 F .[[Promise]] 로 둡니다.
alreadyResolved 를 F .[[AlreadyResolved]] 로 둡니다.
alreadyResolved .[[Value]] 가
true 이면 undefined 를 반환합니다.
alreadyResolved .[[Value]] 를
true 로 설정합니다.
RejectPromise (promise ,
reason )를 수행합니다.
undefined 를 반환합니다.
프라미스 reject 함수의 "length" 속성 값은 1 𝔽 입니다.
27.2.1.3.2 Promise Resolve Functions
프라미스 resolve 함수는 [[Promise]] 와 [[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수입니다.
프라미스 resolve 함수가 resolution 인자와 함께 호출되면 다음 단계를 수행합니다:
F 를 활성 함수 객체 로 둡니다.
Assert : F 는 [[Promise]] 내부 슬롯을 가지고 있으며, 그 값은 객체 입니다.
promise 를 F .[[Promise]] 로 둡니다.
alreadyResolved 를 F .[[AlreadyResolved]] 로 둡니다.
alreadyResolved .[[Value]] 가
true 이면 undefined 를 반환합니다.
alreadyResolved .[[Value]] 를
true 로 설정합니다.
SameValue (resolution ,
promise )가 true 이면,
selfResolutionError 를 새로 생성한 TypeError 객체로
둡니다.
RejectPromise (promise ,
selfResolutionError )를 수행합니다.
undefined 를 반환합니다.
resolution 이 객체가 아니면 ,
FulfillPromise (promise ,
resolution )를 수행합니다.
undefined 를 반환합니다.
then 을 Completion (Get (resolution ,
"then" ))로 둡니다.
then 이 abrupt
completion 이면,
RejectPromise (promise ,
then .[[Value]] )를 수행합니다.
undefined 를 반환합니다.
thenAction 을 then .[[Value]] 로 둡니다.
IsCallable (thenAction )가
false 이면,
FulfillPromise (promise ,
resolution )를 수행합니다.
undefined 를 반환합니다.
thenJobCallback 을 HostMakeJobCallback (thenAction )로
둡니다.
job 을 NewPromiseResolveThenableJob (promise ,
resolution , thenJobCallback )로 둡니다.
HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] )를 수행합니다.
undefined 를 반환합니다.
프라미스 resolve 함수의 "length" 속성 값은 1 𝔽 입니다.
27.2.1.4 FulfillPromise ( promise , value )
FulfillPromise 추상 연산은 promise (Promise)와 value (ECMAScript 언어 값 )를 인자로 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
promise .[[PromiseState]] 가
pending 임을 확인합니다.
reactions 를 promise .[[PromiseFulfillReactions]] 로 둡니다.
promise .[[PromiseResult]] 에 value 를
설정합니다.
promise .[[PromiseFulfillReactions]] 에
undefined 를 설정합니다.
promise .[[PromiseRejectReactions]] 에
undefined 를 설정합니다.
promise .[[PromiseState]] 를
fulfilled 로 설정합니다.
TriggerPromiseReactions (reactions ,
value )를 수행합니다.
unused 를 반환합니다.
27.2.1.5 NewPromiseCapability ( C )
NewPromiseCapability 추상 연산은 C (ECMAScript 언어
값 )를 인자로 받아 PromiseCapability
레코드 를 포함하는 정상 완료
또는 throw 완료 를 반환합니다. 이
연산은 C 를 내장 Promise 생성자 와 같은 방식의 생성자 로 사용하여 프라미스를 생성하고 그 resolve 및
reject 함수를 추출하려고 시도합니다. 이렇게 얻은 프라미스와 resolve, reject 함수는 새로운 PromiseCapability 레코드 를 초기화하는 데
사용됩니다. 호출 시 다음 단계들을 수행합니다:
IsConstructor (C )가
false 이면, TypeError 예외를 발생시킵니다.
참고: C 는 Promise 생성자 와 동일한 파라미터 규약을 지원하는 생성자
함수라고 가정합니다 (27.2.3.1 참고).
resolvingFunctions 를 레코드 { [[Resolve]] : undefined , [[Reject]] : undefined }로 둡니다.
executorClosure 를 파라미터 (resolve , reject )를 가지고
resolvingFunctions 를 캡처하는 새로운 Abstract Closure 로
둡니다. 호출 시 다음 단계들을 수행합니다:
resolvingFunctions .[[Resolve]] 가
undefined 가 아니면, TypeError 예외를 발생시킵니다.
resolvingFunctions .[[Reject]] 가
undefined 가 아니면, TypeError 예외를 발생시킵니다.
resolvingFunctions .[[Resolve]] 에
resolve 를 설정합니다.
resolvingFunctions .[[Reject]] 에
reject 를 설정합니다.
NormalCompletion (undefined )을
반환합니다.
executor 를 CreateBuiltinFunction (executorClosure ,
2, "" , « »)로 둡니다.
promise 를 ? Construct (C , «
executor »)로 둡니다.
IsCallable (resolvingFunctions .[[Resolve]] )가 false 이면,
TypeError 예외를 발생시킵니다.
IsCallable (resolvingFunctions .[[Reject]] )가 false 이면,
TypeError 예외를 발생시킵니다.
PromiseCapability 레코드 {
[[Promise]] : promise , [[Resolve]] : resolvingFunctions .[[Resolve]] , [[Reject]] :
resolvingFunctions .[[Reject]] }를 반환합니다.
참고
이 추상 연산은 Promise 서브클래싱을 지원하며, 전달된 executor 함수 인자를 Promise 생성자 와
동일한 방식으로 호출하는 모든 생성자 에 대해 일반적으로 동작합니다. 이는 Promise 생성자 의
정적 메서드를 모든 서브클래스에 일반화하는 데 사용됩니다.
27.2.1.6 IsPromise ( x )
IsPromise 추상 연산은 인수 x ( ECMAScript 언어 값
)를 받아 Boolean 값을 반환합니다. 이 연산은 객체의 프라미스 브랜드를 확인합니다. 호출 시 다음 단계들을 수행합니다:
x 가 객체가 아니면 false 를
반환한다.
x 가 [[PromiseState]] 내부 슬롯을 가지고 있지 않으면,
false 를 반환한다.
true 를 반환한다.
27.2.1.7 RejectPromise ( promise , reason )
RejectPromise 추상 연산은 인수 promise (프라미스)와 reason ( ECMAScript 언어 값 )를 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
promise .[[PromiseState]] 가
pending 이다.
reactions 에 promise .[[PromiseRejectReactions]] 을 할당한다.
promise .[[PromiseResult]] 에 reason 을
할당한다.
promise .[[PromiseFulfillReactions]] 에
undefined 를 할당한다.
promise .[[PromiseRejectReactions]] 에
undefined 를 할당한다.
promise .[[PromiseState]] 에
rejected 를 할당한다.
promise .[[PromiseIsHandled]] 이
false 이면, HostPromiseRejectionTracker (promise ,
"reject" )를 수행한다.
TriggerPromiseReactions (reactions ,
reason )를 수행한다.
unused 를 반환한다.
27.2.1.8 TriggerPromiseReactions ( reactions ,
argument )
TriggerPromiseReactions 추상 연산은 인수 reactions ( 리스트 및 PromiseReaction 레코드 의 리스트 )와
argument ( ECMAScript 언어 값 )를 받아
unused 를 반환합니다. reactions 의 각 레코드에 대해 새로운 Job 을 큐에 추가합니다. 각 Job 은 PromiseReaction 레코드 의 [[Type]] 과 [[Handler]] 를 처리하며, [[Handler]] 가 empty 가 아니면 해당 인수를 넘겨 호출합니다. [[Handler]] 가 empty 일 경우 동작은 [[Type]] 에 의해 결정됩니다. 호출 시 다음 단계들을 수행합니다:
reactions 의 각 요소 reaction 에 대해 다음을 수행한다:
job 에 NewPromiseReactionJob (reaction ,
argument )을 할당한다.
HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] )를 수행한다.
unused 를 반환한다.
27.2.1.9 HostPromiseRejectionTracker ( promise ,
operation )
호스트 정의
추상 연산 HostPromiseRejectionTracker는 인수 promise (프라미스)와 operation (
"reject" 또는 "handle" )를 받아
unused 를 반환합니다. 이 연산은 호스트 환경 이 프라미스 거부를 추적할 수 있게
합니다.
HostPromiseRejectionTracker의 기본 구현은 unused 를 반환하는 것입니다.
참고 1
HostPromiseRejectionTracker는 두 가지 상황에서 호출됩니다:
프라미스가 핸들러 없이 거부될 때 operation 인수가 "reject" 로 설정되어
호출됩니다.
거부된 프라미스에 처음으로 핸들러가 추가될 때 operation 인수가 "handle" 로
설정되어 호출됩니다.
HostPromiseRejectionTracker의 일반적인 구현은 처리되지 않은 거부에 대해 개발자에게 알릴 수 있으나, 이후 새 핸들러가 추가되어
이전 알림이 무효화될 경우에도 신중하게 알리도록 할 수 있습니다.
참고 2
operation 이 "handle" 인 경우, 구현체는 promise 에 대한
참조를 가비지 컬렉션을 방해하지 않는 방식으로 유지해야 합니다. operation 이
"reject" 인 경우에는, 거부가 드물고 핵심 코드 경로가 아니므로 promise 에 대한 참조를
유지할 수 있습니다.
27.2.2 프라미스 잡(Promise Jobs)
27.2.2.1 NewPromiseReactionJob ( reaction ,
argument )
NewPromiseReactionJob 추상 연산은 reaction ( PromiseReaction 레코드 )와
argument ( ECMAScript 언어 값 )을 인수로 받으며,
[[Job]] ( 잡(Job) 추상 클로저(Abstract Closure)
) 및 [[Realm]] ( Realm 레코드 또는 null ) 필드를 갖는
레코드 를 반환합니다. 들어오는 값에
적절한 핸들러를 적용하고, 핸들러의 반환값을 사용하여 그 핸들러와 연관된 파생 프라미스를 resolve 또는 reject하는 새로운 잡(Job) 추상
클로저 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
job 에 다음 단계들을 수행하는, 파라미터 없이 reaction 과 argument 를 캡처하는
새로운 잡(Job)
추상 클로저 를 할당한다:
promiseCapability 에 reaction .[[Capability]] 를 할당한다.
type 에 reaction .[[Type]] 를
할당한다.
handler 에 reaction .[[Handler]] 를 할당한다.
handler 가 empty 이면,
type 이 fulfill 이면,
handlerResult 에 NormalCompletion (argument )을
할당한다.
그렇지 않으면,
Assert :
type 이 reject 임을 보장한다.
handlerResult 에 ThrowCompletion (argument )을
할당한다.
그렇지 않으면,
handlerResult 에 Completion (HostCallJobCallback (handler ,
undefined , « argument »))을 할당한다.
promiseCapability 가 undefined 이면,
Assert :
handlerResult 가 비정상
종료(abrupt completion) 가 아님을 보장한다.
empty 를 반환한다.
Assert : promiseCapability 가
PromiseCapability
레코드 임을 보장한다.
handlerResult 가 비정상 종료(abrupt
completion) 이면,
다음 값을 반환한다: ? Call (promiseCapability .[[Reject]] , undefined , «
handlerResult .[[Value]] »).
그렇지 않으면,
다음 값을 반환한다: ? Call (promiseCapability .[[Resolve]] , undefined , «
handlerResult .[[Value]] »).
handlerRealm 에 null 을 할당한다.
reaction .[[Handler]] 가
empty 가 아니면,
getHandlerRealmResult 에 Completion (GetFunctionRealm (reaction .[[Handler]] .[[Callback]] ))을
할당한다.
getHandlerRealmResult 가 정상 종료(normal
completion) 이면 handlerRealm 에
getHandlerRealmResult .[[Value]] 를 할당한다.
그렇지 않으면 handlerRealm 에 현재 Realm 레코드 를
할당한다.
NOTE: handlerRealm 은 핸들러가 undefined 일 때만
null 이다. 핸들러가 해제된 Proxy이고 ECMAScript 코드가 실행되지 않을 때,
handlerRealm 은 에러 객체를 생성하는 데 사용된다.
다음 레코드 를 반환한다: {
[[Job]] : job , [[Realm]] : handlerRealm }.
27.2.2.2 NewPromiseResolveThenableJob (
promiseToResolve , thenable , then )
NewPromiseResolveThenableJob 추상 연산은 promiseToResolve (프라미스), thenable
(객체), then ( JobCallback 레코드 )를 인수로 받고, [[Job]] ( 잡(Job) 추상 클로저(Abstract Closure)
) 및 [[Realm]] ( Realm 레코드 ) 필드를 갖는 레코드 를 반환합니다. 호출 시 다음
단계들을 수행합니다:
job 에 다음 단계들을 수행하는, 파라미터 없이 promiseToResolve ,
thenable , then 을 캡처하는 새로운 잡(Job) 추상
클로저 를 할당한다:
resolvingFunctions 에 CreateResolvingFunctions (promiseToResolve )를
할당한다.
thenCallResult 에 Completion (HostCallJobCallback (then ,
thenable , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »))를 할당한다.
thenCallResult 가 비정상 종료(abrupt
completion) 이면,
다음 값을 반환한다: ? Call (resolvingFunctions .[[Reject]] , undefined , «
thenCallResult .[[Value]] »).
다음 값을 반환한다: ! thenCallResult .
getThenRealmResult 에 Completion (GetFunctionRealm (then .[[Callback]] ))를 할당한다.
getThenRealmResult 가 정상 종료(normal
completion) 이면 thenRealm 에
getThenRealmResult .[[Value]] 를 할당한다.
그렇지 않으면 thenRealm 에 현재 Realm 레코드 를 할당한다.
NOTE: thenRealm 은 null 이 되는 경우는 없다. then .[[Callback]] 이 해제된 Proxy이고 코드가 실행되지 않을 때,
thenRealm 은 에러 객체 생성에 사용된다.
다음 레코드 를 반환한다: {
[[Job]] : job , [[Realm]] : thenRealm }.
참고
이 잡(Job) 은 제공된
thenable과 그 then 메서드를 사용해 주어진 프라미스를 resolve합니다. 이 과정은 잡(Job) 으로 진행되어야 하며, 이를
통해 then 메서드의 평가가 주변 코드의 평가가 완료된 이후에 이루어짐을 보장합니다.
27.2.3 프라미스 생성자
Promise 생성자 :
%Promise% 이다.
전역
객체 의 "Promise" 프로퍼티의 초기값이다.
생성자 로 호출될
때 새로운 프라미스를 생성하고 초기화한다.
함수로 호출되는 것은 의도하지 않았으며, 그렇게 호출하면 예외가 발생한다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자 는
super를 사용하여 Promise 생성자 를 호출해야 하며, 이는 Promise 및
Promise.prototype 내장 메서드를 지원하는 내부 상태로 서브클래스 인스턴스를 생성 및 초기화한다.
27.2.3.1 Promise ( executor )
이 함수는 호출 시 다음 단계들을 수행한다:
NewTarget이 undefined 이면, TypeError 예외를 throw한다.
IsCallable (executor )가
false 이면, TypeError 예외를 throw한다.
promise 에 ? OrdinaryCreateFromConstructor (NewTarget,
"%Promise.prototype%" , « [[PromiseState]] , [[PromiseResult]] , [[PromiseFulfillReactions]] , [[PromiseRejectReactions]] , [[PromiseIsHandled]] ») 를 할당한다.
promise .[[PromiseState]] 를
pending 으로 설정한다.
promise .[[PromiseResult]] 를
empty 로 설정한다.
promise .[[PromiseFulfillReactions]] 를 새로운 빈
리스트 로 설정한다.
promise .[[PromiseRejectReactions]] 를 새로운 빈
리스트 로 설정한다.
promise .[[PromiseIsHandled]] 를
false 로 설정한다.
resolvingFunctions 에 CreateResolvingFunctions (promise )를
할당한다.
completion 에 Completion (Call (executor ,
undefined , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »))를 할당한다.
completion 이 비정상
종료(abrupt completion) 이면,
? Call (resolvingFunctions .[[Reject]] , undefined , «
completion .[[Value]] ») 를 수행한다.
promise 를 반환한다.
참고
executor 인수는 함수 객체 여야 한다. 이 함수는 프라미스가 나타내는 지연된 작업의
시작 및 완료 보고를 위해 호출된다. executor는 resolve 와 reject 두 개의 인수를 받아
호출된다. 이 함수들은 executor 함수가 지연된 계산의 완료 또는 실패를 알릴 때 사용할 수 있다. executor 함수가
반환된다고 해서 지연된 작업이 완료된 것은 아니며, 단지 지연된 작업을 나중에 수행하도록 요청이 수락되었다는 의미다.
executor 함수에 전달된 resolve 함수는 하나의 인수를 받는다. executor
코드는 결국 resolve 함수를 호출하여 연관된 프라미스를 resolve하고자 함을 나타낼 수 있다.
resolve 함수에 전달된 인수는 지연된 작업의 최종 값이며, 실제 이행 값 또는 이행 시 값을 제공할 또 다른 프라미스가 될 수
있다.
executor 함수에 전달된 reject 함수 역시 하나의 인수를 받는다. executor
코드는 결국 reject 함수를 호출하여 연관된 프라미스가 거부되었고 이행되지 않을 것임을 나타낼 수 있다.
reject 함수에 전달된 인수는 프라미스의 거부 값으로 사용되며, 일반적으로 Error 객체가 된다.
Promise 생성자 가 executor 함수에 전달하는
resolve와 reject 함수는 실제로 연관된 프라미스를 resolve하거나 reject할 수 있다. 서브클래스는 resolve와 reject에
대해 맞춤값을 전달하는 등 다른 생성자 동작을 가질 수 있다.
27.2.4 Promise 생성자의 속성
Promise 생성자 :
27.2.4.1 Promise.all ( iterable )
이 함수는 전달된 프라미스들의 이행 값 배열로 이행되는 새로운 프라미스를 반환하거나, 전달된 프라미스 중 가장 먼저 거부된 이유로 거부된다. 이 알고리즘이 실행되는
동안 전달된 iterable 의 모든 요소를 프라미스로 변환한다.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
promiseResolve 에 Completion (GetPromiseResolve (C ))를 할당한다.
IfAbruptRejectPromise (promiseResolve ,
promiseCapability )를 수행한다.
iteratorRecord 에 Completion (GetIterator (iterable ,
sync ))를 할당한다.
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability )를 수행한다.
result 에 Completion (PerformPromiseAll (iteratorRecord ,
C , promiseCapability , promiseResolve ))를 할당한다.
result 가 비정상
종료(abrupt completion) 이면,
iteratorRecord .[[Done]] 이
false 이면, result 에 Completion (IteratorClose (iteratorRecord ,
result ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
! result 를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다.
27.2.4.1.1 GetPromiseResolve ( promiseConstructor
)
GetPromiseResolve 추상 연산은 promiseConstructor ( 생성자 )를 인수로 받아 함수
객체 를 담은 정상 종료(normal
completion) 또는 throw
completion 를 반환한다. 호출 시 다음 단계들을 수행한다:
promiseResolve 에 ? Get (promiseConstructor ,
"resolve" )를 할당한다.
IsCallable (promiseResolve )가
false 이면, TypeError 예외를 throw한다.
promiseResolve 를 반환한다.
27.2.4.1.2 PerformPromiseAll ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
PerformPromiseAll 추상 연산은 iteratorRecord ( Iterator Record ),
constructor ( 생성자 ), resultCapability (
PromiseCapability Record ),
promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값 를 담은
정상 종료(normal
completion) 또는 throw
completion 를 반환한다. 호출 시 다음 단계들을 수행한다:
values 에 새로운 빈 리스트 를 할당한다.
remainingElementsCount 에 레코드 { [[Value]] : 1 }를 할당한다.
index 에 0을 할당한다.
반복한다,
next 에 ? IteratorStepValue (iteratorRecord )를
할당한다.
next 가 done 이면,
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
valuesArray 에 CreateArrayFromList (values )를
할당한다.
? Call (resultCapability .[[Resolve]] ,
undefined , « valuesArray
»)를 수행한다.
resultCapability .[[Promise]] 를 반환한다.
values 에 undefined 를 추가한다.
nextPromise 에 ? Call (promiseResolve ,
constructor , « next »)를 할당한다.
steps 에 Promise.all
Resolve Element Functions 에 정의된 알고리즘 단계를 할당한다.
length 에 Promise.all
Resolve Element Functions 함수 정의의 비선택적 매개변수 개수를
할당한다.
onFulfilled 에 CreateBuiltinFunction (steps ,
length , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »)를 할당한다.
onFulfilled .[[AlreadyCalled]] 를
false 로 설정한다.
onFulfilled .[[Index]] 를
index 로 설정한다.
onFulfilled .[[Values]] 를
values 로 설정한다.
onFulfilled .[[Capability]] 를
resultCapability 로 설정한다.
onFulfilled .[[RemainingElements]] 를
remainingElementsCount 로 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] +
1로 설정한다.
? Invoke (nextPromise ,
"then" , « onFulfilled ,
resultCapability .[[Reject]] ») 를
수행한다.
index 를 index + 1로 설정한다.
27.2.4.1.3 Promise.all 이행 요소 함수
Promise.all 이행 요소 함수는 특정 Promise.all 요소를 이행하기 위해 사용되는 익명 내장
함수입니다. 각 Promise.all 이행 요소 함수는 [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 내부 슬롯을 가집니다.
Promise.all 이행 요소 함수가 인수 x 로 호출되면, 다음 단계들을 수행합니다:
F 에 활성 함수 객체 를 할당한다.
F .[[AlreadyCalled]] 이
true 이면 undefined 를 반환한다.
F .[[AlreadyCalled]] 를
true 로 설정한다.
index 에 F .[[Index]] 를 할당한다.
values 에 F .[[Values]] 를 할당한다.
promiseCapability 에 F .[[Capability]] 를 할당한다.
remainingElementsCount 에 F .[[RemainingElements]] 를 할당한다.
values [index ]에 x 를 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
valuesArray 에 CreateArrayFromList (values )를
할당한다.
다음 값을 반환한다: ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
undefined 를 반환한다.
Promise.all 이행 요소 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
27.2.4.2 Promise.allSettled ( iterable )
이 함수는 프라미스 상태 스냅샷 배열로 이행되는 프라미스를 반환하지만, 모든 원래 프라미스가 settle(즉, 이행 또는 거부됨)이 된 후에만 반환합니다. 이
알고리즘이 실행되는 동안 전달된 iterable 의 모든 요소를 프라미스로 변환합니다.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
promiseResolve 에 Completion (GetPromiseResolve (C ))를 할당한다.
IfAbruptRejectPromise (promiseResolve ,
promiseCapability )를 수행한다.
iteratorRecord 에 Completion (GetIterator (iterable ,
sync ))를 할당한다.
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability )를 수행한다.
result 에 Completion (PerformPromiseAllSettled (iteratorRecord ,
C , promiseCapability , promiseResolve ))를 할당한다.
result 가 비정상
종료(abrupt completion) 이면,
iteratorRecord .[[Done]] 이
false 이면, result 에 Completion (IteratorClose (iteratorRecord ,
result ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
! result 를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다.
27.2.4.2.1 PerformPromiseAllSettled (
iteratorRecord , constructor , resultCapability ,
promiseResolve )
PerformPromiseAllSettled 추상 연산은 iteratorRecord ( Iterator Record ),
constructor ( 생성자 ), resultCapability (
PromiseCapability Record ),
promiseResolve ( 함수 객체 )를 인수로 받고, ECMAScript 언어 값 를 담은
정상 종료(normal
completion) 또는 throw
completion 를 반환한다. 호출 시 다음 단계들을 수행한다:
values 에 새로운 빈 리스트 를 할당한다.
remainingElementsCount 에 레코드 { [[Value]] : 1 }를 할당한다.
index 에 0을 할당한다.
반복한다,
next 에 ? IteratorStepValue (iteratorRecord )를
할당한다.
next 가 done 이면,
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
valuesArray 에 CreateArrayFromList (values )를
할당한다.
? Call (resultCapability .[[Resolve]] ,
undefined , « valuesArray
»)를 수행한다.
resultCapability .[[Promise]] 를 반환한다.
values 에 undefined 를 추가한다.
nextPromise 에 ? Call (promiseResolve ,
constructor , « next »)를 할당한다.
stepsFulfilled 에 Promise.allSettled
Resolve Element Functions 에 정의된 알고리즘 단계를 할당한다.
lengthFulfilled 에 Promise.allSettled
Resolve Element Functions 함수 정의의 비선택적 매개변수 개수를
할당한다.
onFulfilled 에 CreateBuiltinFunction (stepsFulfilled ,
lengthFulfilled , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »)를 할당한다.
alreadyCalled 에 레코드
{ [[Value]] : false }를 할당한다.
onFulfilled .[[AlreadyCalled]] 를
alreadyCalled 로 설정한다.
onFulfilled .[[Index]] 를
index 로 설정한다.
onFulfilled .[[Values]] 를
values 로 설정한다.
onFulfilled .[[Capability]] 를
resultCapability 로 설정한다.
onFulfilled .[[RemainingElements]] 를
remainingElementsCount 로 설정한다.
stepsRejected 에 Promise.allSettled
Reject Element Functions 에 정의된 알고리즘 단계를 할당한다.
lengthRejected 에 Promise.allSettled
Reject Element Functions 함수 정의의 비선택적 매개변수 개수를
할당한다.
onRejected 에 CreateBuiltinFunction (stepsRejected ,
lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] ,
[[Capability]] , [[RemainingElements]] »)를 할당한다.
onRejected .[[AlreadyCalled]] 를
alreadyCalled 로 설정한다.
onRejected .[[Index]] 를
index 로 설정한다.
onRejected .[[Values]] 를
values 로 설정한다.
onRejected .[[Capability]] 를
resultCapability 로 설정한다.
onRejected .[[RemainingElements]] 를
remainingElementsCount 로 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] +
1로 설정한다.
? Invoke (nextPromise ,
"then" , « onFulfilled ,
onRejected ») 를 수행한다.
index 를 index + 1로 설정한다.
27.2.4.2.2 Promise.allSettled 이행 요소 함수
Promise.allSettled 이행 요소 함수는 특정 Promise.allSettled 요소를 이행하기 위해
사용되는 익명 내장 함수입니다. 각 Promise.allSettled 이행 요소 함수는 [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ,
[[AlreadyCalled]] 내부 슬롯을 가집니다.
Promise.allSettled 이행 요소 함수가 인수 x 로 호출되면, 다음 단계들을 수행합니다:
F 에 활성 함수 객체 를 할당한다.
alreadyCalled 에 F .[[AlreadyCalled]] 를 할당한다.
alreadyCalled .[[Value]] 가
true 이면 undefined 를 반환한다.
alreadyCalled .[[Value]] 를
true 로 설정한다.
index 에 F .[[Index]] 를 할당한다.
values 에 F .[[Values]] 를 할당한다.
promiseCapability 에 F .[[Capability]] 를 할당한다.
remainingElementsCount 에 F .[[RemainingElements]] 를 할당한다.
obj 에 OrdinaryObjectCreate (%Object.prototype% )를
할당한다.
! CreateDataPropertyOrThrow (obj ,
"status" , "fulfilled" )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"value" , x )를 수행한다.
values [index ]에 obj 를 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
valuesArray 에 CreateArrayFromList (values )를
할당한다.
다음 값을 반환한다: ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
undefined 를 반환한다.
Promise.allSettled 이행 요소 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
27.2.4.2.3 Promise.allSettled 거부 요소 함수
Promise.allSettled 거부 요소 함수는 특정 Promise.allSettled 요소를 거부하기 위해
사용되는 익명 내장 함수입니다. 각 Promise.allSettled 거부 요소 함수는 [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ,
[[AlreadyCalled]] 내부 슬롯을 가집니다.
Promise.allSettled 거부 요소 함수가 인수 x 로 호출되면, 다음 단계들을 수행합니다:
F 에 활성 함수 객체 를 할당한다.
alreadyCalled 에 F .[[AlreadyCalled]] 를 할당한다.
alreadyCalled .[[Value]] 가
true 이면 undefined 를 반환한다.
alreadyCalled .[[Value]] 를
true 로 설정한다.
index 에 F .[[Index]] 를 할당한다.
values 에 F .[[Values]] 를 할당한다.
promiseCapability 에 F .[[Capability]] 를 할당한다.
remainingElementsCount 에 F .[[RemainingElements]] 를 할당한다.
obj 에 OrdinaryObjectCreate (%Object.prototype% )를
할당한다.
! CreateDataPropertyOrThrow (obj ,
"status" , "rejected" )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"reason" , x )를 수행한다.
values [index ]에 obj 를 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
valuesArray 에 CreateArrayFromList (values )를
할당한다.
다음 값을 반환한다: ? Call (promiseCapability .[[Resolve]] , undefined , «
valuesArray »).
undefined 를 반환한다.
Promise.allSettled 거부 요소 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
27.2.4.3 Promise.any ( iterable )
이 함수는 주어진 프라미스 중 가장 먼저 이행되는 프라미스에 의해 이행되거나, 모든 주어진 프라미스가 거부될 경우 거부 이유들을 담은
AggregateError로 거부되는 프라미스를 반환합니다. 이 알고리즘이 실행되는 동안 전달된 iterable 의 모든 요소를 프라미스로 변환합니다.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
promiseResolve 에 Completion (GetPromiseResolve (C ))를 할당한다.
IfAbruptRejectPromise (promiseResolve ,
promiseCapability )를 수행한다.
iteratorRecord 에 Completion (GetIterator (iterable ,
sync ))를 할당한다.
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability )를 수행한다.
result 에 Completion (PerformPromiseAny (iteratorRecord ,
C , promiseCapability , promiseResolve ))를 할당한다.
result 가 비정상
종료(abrupt completion) 이면,
iteratorRecord .[[Done]] 이
false 이면, result 에 Completion (IteratorClose (iteratorRecord ,
result ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
! result 를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다.
27.2.4.3.1 PerformPromiseAny ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
PerformPromiseAny 추상 연산은 iteratorRecord ( Iterator Record ),
constructor ( 생성자 ), resultCapability (
PromiseCapability Record ),
promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값 를 담은
정상 종료(normal
completion) 또는 throw
completion 를 반환한다. 호출 시 다음 단계들을 수행한다:
errors 에 새로운 빈 리스트 를 할당한다.
remainingElementsCount 에 레코드 { [[Value]] : 1 }를 할당한다.
index 에 0을 할당한다.
반복한다,
next 에 ? IteratorStepValue (iteratorRecord )를
할당한다.
next 가 done 이면,
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
error 에 새롭게 생성된
AggregateError 객체를 할당한다.
! DefinePropertyOrThrow (error ,
"errors" , PropertyDescriptor { [[Configurable]] :
true , [[Enumerable]] :
false , [[Writable]] :
true , [[Value]] : CreateArrayFromList (errors )
})를 수행한다.
ThrowCompletion (error )를
반환한다.
resultCapability .[[Promise]] 를 반환한다.
errors 에 undefined 를 추가한다.
nextPromise 에 ? Call (promiseResolve ,
constructor , « next »)를 할당한다.
stepsRejected 에 Promise.any
Reject Element Functions 에 정의된 알고리즘 단계를 할당한다.
lengthRejected 에 Promise.any
Reject Element Functions 함수 정의의 비선택적 매개변수 개수를
할당한다.
onRejected 에 CreateBuiltinFunction (stepsRejected ,
lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Errors]] ,
[[Capability]] , [[RemainingElements]] »)를 할당한다.
onRejected .[[AlreadyCalled]] 를
false 로 설정한다.
onRejected .[[Index]] 를
index 로 설정한다.
onRejected .[[Errors]] 를
errors 로 설정한다.
onRejected .[[Capability]] 를
resultCapability 로 설정한다.
onRejected .[[RemainingElements]] 를
remainingElementsCount 로 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] +
1로 설정한다.
? Invoke (nextPromise ,
"then" , « resultCapability .[[Resolve]] , onRejected ») 를 수행한다.
index 를 index + 1로 설정한다.
27.2.4.3.2 Promise.any 거부 요소 함수
Promise.any 거부 요소 함수는 특정 Promise.any 요소를 거부하기 위해 사용되는 익명 내장
함수입니다. 각 Promise.any 거부 요소 함수는 [[Index]] , [[Errors]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 내부 슬롯을 가집니다.
Promise.any 거부 요소 함수가 인수 x 로 호출되면, 다음 단계들을 수행합니다:
F 에 활성 함수 객체 를 할당한다.
F .[[AlreadyCalled]] 이
true 이면 undefined 를 반환한다.
F .[[AlreadyCalled]] 를
true 로 설정한다.
index 에 F .[[Index]] 를 할당한다.
errors 에 F .[[Errors]] 를 할당한다.
promiseCapability 에 F .[[Capability]] 를 할당한다.
remainingElementsCount 에 F .[[RemainingElements]] 를 할당한다.
errors [index ]에 x 를 설정한다.
remainingElementsCount .[[Value]] 를
remainingElementsCount .[[Value]] - 1로 설정한다.
remainingElementsCount .[[Value]] 가 0이면,
error 에 새롭게 생성된 AggregateError 객체를 할당한다.
! DefinePropertyOrThrow (error ,
"errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors )
})를 수행한다.
? Call (promiseCapability .[[Reject]] , undefined , «
error »)를 반환한다.
undefined 를 반환한다.
Promise.any 거부 요소 함수의 "length" 프로퍼티 값은
1 𝔽 이다.
27.2.4.4 Promise.prototype
Promise.prototype의 초기 값은 Promise 프로토타입
객체 입니다.
이 프로퍼티는 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } 특성을 가집니다.
27.2.4.5 Promise.race ( iterable )
이 함수는 전달받은 프라미스 중 가장 먼저 settle(이행 또는 거부)된 프라미스와 동일한 방식으로 settle되는 새로운 프라미스를 반환합니다. 이 알고리즘이
실행되는 동안 iterable 의 모든 요소를 프라미스로 변환합니다.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
promiseResolve 에 Completion (GetPromiseResolve (C ))를 할당한다.
IfAbruptRejectPromise (promiseResolve ,
promiseCapability )를 수행한다.
iteratorRecord 에 Completion (GetIterator (iterable ,
sync ))를 할당한다.
IfAbruptRejectPromise (iteratorRecord ,
promiseCapability )를 수행한다.
result 에 Completion (PerformPromiseRace (iteratorRecord ,
C , promiseCapability , promiseResolve ))를 할당한다.
result 가 비정상
종료(abrupt completion) 이면,
iteratorRecord .[[Done]] 이
false 이면, result 에 Completion (IteratorClose (iteratorRecord ,
result ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
! result 를 반환한다.
참고 1
iterable 인자가 값을 반환하지 않거나, iterable 이 생성한 모든 프라미스가 settle되지 않는다면,
이 메서드가 반환하는 pending 프라미스는 결코 settle되지 않습니다.
참고 2
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다고 기대합니다. 또한
this 값이 resolve 메서드를 제공해야 합니다.
27.2.4.5.1 PerformPromiseRace ( iteratorRecord ,
constructor , resultCapability , promiseResolve )
PerformPromiseRace 추상 연산은 iteratorRecord ( Iterator Record ),
constructor ( 생성자 ), resultCapability (
PromiseCapability Record ),
promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값 를 담은
정상 종료(normal
completion) 또는 throw
completion 를 반환한다. 호출 시 다음 단계들을 수행한다:
반복한다,
next 에 ? IteratorStepValue (iteratorRecord )를
할당한다.
next 가 done 이면,
resultCapability .[[Promise]] 를 반환한다.
nextPromise 에 ? Call (promiseResolve ,
constructor , « next »)를 할당한다.
? Invoke (nextPromise ,
"then" , « resultCapability .[[Resolve]] , resultCapability .[[Reject]] ») 를 수행한다.
27.2.4.6 Promise.reject ( r )
이 함수는 전달된 인수로 거부된 새로운 프라미스를 반환합니다.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
? Call (promiseCapability .[[Reject]] , undefined , « r »)
를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다고 기대합니다.
27.2.4.7 Promise.resolve ( x )
이 함수는 전달된 인수로 resolve된 새로운 프라미스를 반환하거나, 인수가 이 생성자 에 의해 생성된 프라미스라면 해당 인수 자체를
반환합니다.
C 에 this 값을 할당한다.
C 가 객체가 아니면 , TypeError
예외를 throw한다.
? PromiseResolve (C ,
x )를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다고 기대합니다.
27.2.4.7.1 PromiseResolve ( C , x )
PromiseResolve 추상 연산은 C (객체)와 x ( ECMAScript 언어 값 )을 인수로 받고,
ECMAScript 언어 값 를 담은
정상 종료(normal
completion) 또는 throw
completion 를 반환합니다. x 로 resolve된 새로운 프라미스를 반환합니다. 호출 시
다음 단계들을 수행합니다:
IsPromise (x )가
true 이면,
xConstructor 에 ? Get (x ,
"constructor" )를 할당한다.
SameValue (xConstructor ,
C )가 true 이면 x 를 반환한다.
promiseCapability 에 ? NewPromiseCapability (C )를
할당한다.
? Call (promiseCapability .[[Resolve]] , undefined , «
x ») 를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
27.2.4.8 Promise.try ( callback , ...args )
이 함수는 호출 시 다음 단계들을 수행합니다:
C 에 this 값을 할당한다.
C 가 객체가 아니면 , TypeError
예외를 throw한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
status 에 Completion (Call (callback ,
undefined , args ))를 할당한다.
status 가 비정상
종료(abrupt completion) 이면,
? Call (promiseCapability .[[Reject]] , undefined , «
status .[[Value]] ») 를 수행한다.
그렇지 않으면,
? Call (promiseCapability .[[Resolve]] , undefined , «
status .[[Value]] ») 를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
참고
이 함수는 this 값이 Promise 생성자 의 파라미터 규칙을 지원하는
생성자 함수여야 한다고 기대합니다.
27.2.4.9 Promise.withResolvers ( )
이 함수는 세 개의 프로퍼티를 가진 객체를 반환합니다: 새 프라미스와 이에 연결된 resolve 및 reject 함수.
C 에 this 값을 할당한다.
promiseCapability 에 ? NewPromiseCapability (C )를 할당한다.
obj 에 OrdinaryObjectCreate (%Object.prototype% )를
할당한다.
! CreateDataPropertyOrThrow (obj ,
"promise" , promiseCapability .[[Promise]] )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"resolve" , promiseCapability .[[Resolve]] )를 수행한다.
! CreateDataPropertyOrThrow (obj ,
"reject" , promiseCapability .[[Reject]] )를 수행한다.
obj 를 반환한다.
27.2.4.10 get Promise [ %Symbol.species% ]
Promise[%Symbol.species%]는 set 접근자 함수가 undefined 인 접근자
프로퍼티 입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:
this 값을 반환한다.
이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]" 입니다.
참고
Promise 프로토타입 메서드는 일반적으로 this 값의 생성자 를 사용해 파생 객체를 생성합니다. 하지만
서브클래스 생성자 는 %Symbol.species% 프로퍼티를 재정의하여
기본 동작을 변경할 수 있습니다.
27.2.5 프라미스 프로토타입 객체의 속성
프라미스 프로토타입 객체 :
%Promise.prototype% 이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
일반
객체 이다.
[[PromiseState]] 내부 슬롯이나 프라미스 인스턴스의 다른 내부 슬롯을 가지지 않는다.
27.2.5.1 Promise.prototype.catch ( onRejected )
이 메서드는 호출 시 다음 단계들을 수행합니다:
promise 에 this 값을 할당한다.
? Invoke (promise ,
"then" , « undefined , onRejected »)를
반환한다.
27.2.5.2 Promise.prototype.constructor
Promise.prototype.constructor의 초기 값은 %Promise% 입니다.
27.2.5.3 Promise.prototype.finally ( onFinally )
이 메서드는 호출 시 다음 단계들을 수행합니다:
promise 에 this 값을 할당한다.
promise 가 객체가 아니면 , TypeError
예외를 throw한다.
C 에 ? SpeciesConstructor (promise ,
%Promise% )를 할당한다.
Assert :
IsConstructor (C )가
true 임을 보장한다.
IsCallable (onFinally )가
false 이면,
thenFinally 에 onFinally 를 할당한다.
catchFinally 에 onFinally 를 할당한다.
그렇지 않으면,
thenFinallyClosure 에 파라미터 (value )를 가지며
onFinally 와 C 를 캡처하고, 호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
result 에 ? Call (onFinally ,
undefined )를 할당한다.
p 에 ? PromiseResolve (C ,
result )를 할당한다.
returnValue 에 파라미터 없이 value 를 캡처하고 호출 시
NormalCompletion (value )를
반환하는 새로운 추상 클로저 를 할당한다.
valueThunk 에 CreateBuiltinFunction (returnValue ,
0, "" , « »)를 할당한다.
? Invoke (p ,
"then" , « valueThunk »)를 반환한다.
thenFinally 에 CreateBuiltinFunction (thenFinallyClosure ,
1, "" , « »)를 할당한다.
catchFinallyClosure 에 파라미터 (reason )를 가지며
onFinally 와 C 를 캡처하고, 호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
result 에 ? Call (onFinally ,
undefined )를 할당한다.
p 에 ? PromiseResolve (C ,
result )를 할당한다.
throwReason 에 파라미터 없이 reason 을 캡처하고 호출 시
ThrowCompletion (reason )를
반환하는 새로운 추상 클로저 를 할당한다.
thrower 에 CreateBuiltinFunction (throwReason ,
0, "" , « »)를 할당한다.
? Invoke (p ,
"then" , « thrower »)를 반환한다.
catchFinally 에 CreateBuiltinFunction (catchFinallyClosure ,
1, "" , « »)를 할당한다.
? Invoke (promise ,
"then" , « thenFinally , catchFinally »)를
반환한다.
27.2.5.4 Promise.prototype.then ( onFulfilled ,
onRejected )
이 메서드는 호출 시 다음 단계들을 수행합니다:
promise 에 this 값을 할당한다.
IsPromise (promise )가
false 이면, TypeError 예외를 throw한다.
C 에 ? SpeciesConstructor (promise ,
%Promise% )를 할당한다.
resultCapability 에 ? NewPromiseCapability (C )를 할당한다.
PerformPromiseThen (promise ,
onFulfilled , onRejected , resultCapability )를 반환한다.
27.2.5.4.1 PerformPromiseThen ( promise ,
onFulfilled , onRejected [ , resultCapability ] )
PerformPromiseThen 추상 연산은 promise (프라미스), onFulfilled ( ECMAScript 언어 값 ),
onRejected ( ECMAScript 언어
값 ) 및 선택적 인수 resultCapability ( PromiseCapability Record )를
받아 ECMAScript 언어 값 를 반환합니다. 이
연산은 promise 에 대해 onFulfilled 및 onRejected 을 settle 액션으로
사용하여 "then" 동작을 수행합니다. resultCapability 가 전달되면, 결과는
resultCapability 의 promise를 업데이트하여 저장됩니다. 전달되지 않으면, PerformPromiseThen은 명세 내부
연산에 의해 호출되어 결과가 중요하지 않은 경우입니다. 호출 시 다음 단계들을 수행합니다:
Assert : IsPromise (promise )가
true 임을 보장한다.
resultCapability 가 제공되지 않았다면,
resultCapability 를 undefined 로 설정한다.
IsCallable (onFulfilled )가
false 이면,
onFulfilledJobCallback 에 empty 를 할당한다.
그렇지 않으면,
onFulfilledJobCallback 에 HostMakeJobCallback (onFulfilled )을
할당한다.
IsCallable (onRejected )가
false 이면,
onRejectedJobCallback 에 empty 를 할당한다.
그렇지 않으면,
onRejectedJobCallback 에 HostMakeJobCallback (onRejected )을
할당한다.
fulfillReaction 에 PromiseReaction
Record { [[Capability]] :
resultCapability , [[Type]] :
fulfill , [[Handler]] :
onFulfilledJobCallback }를 할당한다.
rejectReaction 에 PromiseReaction
Record { [[Capability]] :
resultCapability , [[Type]] :
reject , [[Handler]] :
onRejectedJobCallback }를 할당한다.
promise .[[PromiseState]] 가
pending 이면,
fulfillReaction 을 promise .[[PromiseFulfillReactions]] 에 추가한다.
rejectReaction 을 promise .[[PromiseRejectReactions]] 에 추가한다.
그렇지 않고 promise .[[PromiseState]] 가
fulfilled 이면,
value 에 promise .[[PromiseResult]] 를 할당한다.
fulfillJob 에 NewPromiseReactionJob (fulfillReaction ,
value )를 할당한다.
HostEnqueuePromiseJob (fulfillJob .[[Job]] , fulfillJob .[[Realm]] )를 수행한다.
그 밖의 경우,
Assert : promise .[[PromiseState]] 가
rejected 임을 보장한다.
reason 에 promise .[[PromiseResult]] 를 할당한다.
promise .[[PromiseIsHandled]] 가
false 이면, HostPromiseRejectionTracker (promise ,
"handle" )를 수행한다.
rejectJob 에 NewPromiseReactionJob (rejectReaction ,
reason )를 할당한다.
HostEnqueuePromiseJob (rejectJob .[[Job]] , rejectJob .[[Realm]] )를 수행한다.
promise .[[PromiseIsHandled]] 를
true 로 설정한다.
resultCapability 가 undefined 이면,
undefined 를 반환한다.
그렇지 않으면,
resultCapability .[[Promise]] 를 반환한다.
27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열
"Promise" 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.2.6 프라미스 인스턴스의 속성
프라미스 인스턴스는 일반
객체 이며, 프라미스 프로토타입
객체 (내장, %Promise.prototype% )로부터
프로퍼티를 상속받습니다. 프라미스 인스턴스는 표 92 에 기술된
내부 슬롯들과 함께 처음 생성됩니다.
표 92: 프라미스 인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[PromiseState]]
pending , fulfilled , 또는
rejected
프라미스가 then 메서드에 대한 호출에 어떻게 반응할지 관리합니다.
[[PromiseResult]]
ECMAScript 언어 값
또는 empty
프라미스가 이행 또는 거부된 값(있다면). [[PromiseState]] 가
pending 일 때만 empty 입니다.
[[PromiseFulfillReactions]]
리스트
(PromiseReaction
레코드 의 리스트)
프라미스가 pending 상태에서 fulfilled
상태로 전이될 때 처리될 레코드 들입니다.
[[PromiseRejectReactions]]
리스트
(PromiseReaction
레코드 의 리스트)
프라미스가 pending 상태에서 rejected
상태로 전이될 때 처리될 레코드 들입니다.
[[PromiseIsHandled]]
불리언 값
프라미스가 fulfillment 또는 rejection 핸들러를 가진 적이 있는지 나타냅니다. 미처리 거부 추적에 사용됩니다.
27.3 GeneratorFunction 객체
GeneratorFunction은 일반적으로 GeneratorDeclaration , GeneratorExpression , GeneratorMethod 를 평가함으로써 생성되는 함수입니다.
또한 %GeneratorFunction% 내장 객체를 호출하여 생성될
수 있습니다.
그림 6 (설명): Generator 객체의 관계
27.3.1 GeneratorFunction 생성자
GeneratorFunction 생성자 :
%GeneratorFunction% 이다.
Function의 서브클래스이다.
함수로 호출될 때 새로운 GeneratorFunction을 생성 및 초기화한다. 즉, GeneratorFunction (…) 함수 호출은 같은
인자를 가진 new GeneratorFunction (…) 객체 생성 표현과 동일하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 GeneratorFunction 동작을 상속하고자 하는 서브클래스
생성자 는 내장
GeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 GeneratorFunction 생성자 에 대한
super 호출을 포함해야 한다. ECMAScript의 모든 generator 함수 객체 정의 구문은
GeneratorFunction의 직접 인스턴스를 생성한다. GeneratorFunction 서브클래스의 인스턴스를 생성하는 구문은 존재하지 않는다.
27.3.1.1 GeneratorFunction ( ...parameterArgs ,
bodyArg )
마지막 인수(있다면)는 generator 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.
이 함수는 호출 시 다음 단계들을 수행한다:
C 에 활성 함수 객체 를 할당한다.
bodyArg 가 없으면, bodyArg 를 빈 문자열로 설정한다.
? CreateDynamicFunction (C ,
NewTarget, generator , parameterArgs ,
bodyArg )를 반환한다.
참고
27.3.2 GeneratorFunction 생성자의 속성
GeneratorFunction 생성자 :
Function 생성자 로부터 상속받는 표준 내장 함수
객체 이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function% 이다.
"length" 프로퍼티 값은
1 𝔽 이다.
"name" 프로퍼티 값은 "GeneratorFunction" 이다.
다음 프로퍼티를 가진다:
27.3.2.1 GeneratorFunction.prototype
GeneratorFunction.prototype의 초기 값은 GeneratorFunction
프로토타입 객체 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } 이다.
27.3.3 GeneratorFunction 프로토타입 객체의 속성
GeneratorFunction 프로토타입 객체 :
27.3.3.1 GeneratorFunction.prototype.constructor
GeneratorFunction.prototype.constructor의 초기 값은 %GeneratorFunction% 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.3.3.2 GeneratorFunction.prototype.prototype
GeneratorFunction.prototype.prototype의 초기 값은 %GeneratorPrototype% 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열
"GeneratorFunction" 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.3.4 GeneratorFunction 인스턴스
모든 GeneratorFunction 인스턴스는 ECMAScript 함수 객체 이며, 표 30 에 명시된 내부
슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은
false 입니다.
각 GeneratorFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:
27.3.4.1 length
"length" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.1 참조)는 GeneratorFunction
인스턴스에도 적용됩니다.
27.3.4.2 name
"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는 GeneratorFunction
인스턴스에도 적용됩니다.
27.3.4.3 prototype
GeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체 가 함께 생성되며, 이는 generator 함수의
"prototype" 프로퍼티의 초기 값이 됩니다. prototype 프로퍼티의 값은 generator 함수 객체 가
[[Call]] 을 사용하여 호출될 때 새롭게 생성되는 Generator의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.
이 프로퍼티의 특성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } 입니다.
참고
Function 인스턴스와 달리, GeneratorFunction의 "prototype" 프로퍼티의 값인 객체는
GeneratorFunction 인스턴스를 값으로 갖는 "constructor" 프로퍼티를 가지고 있지 않습니다.
27.4 AsyncGeneratorFunction 객체
AsyncGeneratorFunction은 일반적으로 AsyncGeneratorDeclaration , AsyncGeneratorExpression ,
AsyncGeneratorMethod 구문을
평가하여 생성되는 함수입니다. 또한 %AsyncGeneratorFunction% 내장
객체를 호출하여 생성될 수 있습니다.
27.4.1 AsyncGeneratorFunction 생성자
AsyncGeneratorFunction 생성자 :
%AsyncGeneratorFunction% 이다.
Function의 서브클래스이다.
함수로 호출될 때 새로운 AsyncGeneratorFunction을 생성 및 초기화한다. 즉,
AsyncGeneratorFunction (...) 함수 호출은 같은 인자를 가진
new AsyncGeneratorFunction (...) 객체 생성 표현과 동일하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 AsyncGeneratorFunction 동작을 상속하고자 하는 서브클래스
생성자 는 내장
AsyncGeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 AsyncGeneratorFunction
생성자 에 대한
super 호출을 포함해야 한다. ECMAScript의 모든 async generator 함수 객체
정의 구문은 AsyncGeneratorFunction의 직접 인스턴스를 생성한다. AsyncGeneratorFunction 서브클래스의 인스턴스를 생성하는 구문은
존재하지 않는다.
27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs ,
bodyArg )
마지막 인수(있다면)는 async generator 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.
이 함수는 호출 시 다음 단계들을 수행한다:
C 에 활성 함수 객체 를 할당한다.
bodyArg 가 없으면, bodyArg 를 빈 문자열로 설정한다.
? CreateDynamicFunction (C ,
NewTarget, async-generator , parameterArgs ,
bodyArg )를 반환한다.
참고
27.4.2 AsyncGeneratorFunction 생성자의 속성
AsyncGeneratorFunction 생성자 :
Function 생성자 로부터 상속받는 표준 내장 함수
객체 이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function% 이다.
"length" 프로퍼티 값은
1 𝔽 이다.
"name" 프로퍼티 값은 "AsyncGeneratorFunction" 이다.
다음 프로퍼티를 가진다:
27.4.2.1 AsyncGeneratorFunction.prototype
AsyncGeneratorFunction.prototype의 초기 값은 AsyncGeneratorFunction
프로토타입 객체 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } 이다.
27.4.3 AsyncGeneratorFunction 프로토타입 객체의 속성
AsyncGeneratorFunction 프로토타입 객체 :
27.4.3.1 AsyncGeneratorFunction.prototype.constructor
AsyncGeneratorFunction.prototype.constructor의 초기 값은 %AsyncGeneratorFunction% 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.4.3.2 AsyncGeneratorFunction.prototype.prototype
AsyncGeneratorFunction.prototype.prototype의 초기 값은 %AsyncGeneratorPrototype% 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag%
]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열
"AsyncGeneratorFunction" 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.4.4 AsyncGeneratorFunction 인스턴스
모든 AsyncGeneratorFunction 인스턴스는 ECMAScript 함수 객체 이며, 표 30 에 명시된 내부
슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은
false 입니다.
각 AsyncGeneratorFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:
27.4.4.1 length
"length" 프로퍼티의 값은 AsyncGeneratorFunction이 일반적으로 기대하는 인자의 개수를 나타내는
정수형
Number 입니다. 하지만, 언어는 이 함수가 다른 개수의 인자로 호출될 수 있도록 허용합니다.
AsyncGeneratorFunction이 "length" 프로퍼티에 지정된 개수와 다른 인자 개수로 호출될 때의 동작은 함수에
따라 다릅니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.4.4.2 name
"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는
AsyncGeneratorFunction 인스턴스에도 적용됩니다.
27.4.4.3 prototype
AsyncGeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체 가 함께 생성되며, 이는 async
generator 함수의 "prototype" 프로퍼티의 초기 값이 됩니다. prototype 프로퍼티의 값은 async
generator 함수
객체 가 [[Call]] 을 사용하여 호출될 때 새롭게 생성되는
AsyncGenerator의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.
이 프로퍼티의 특성은 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } 입니다.
참고
함수 인스턴스와 달리, AsyncGeneratorFunction의 "prototype" 프로퍼티의 값인 객체는
AsyncGeneratorFunction 인스턴스를 값으로 갖는 "constructor" 프로퍼티를 가지고 있지
않습니다.
27.5 Generator 객체
Generator는 generator 함수를 호출하여 생성되며 이터레이터 인터페이스 와 이터러블
인터페이스 모두를 따릅니다.
Generator 인스턴스는 인스턴스를 생성한 generator 함수의 "prototype" 프로퍼티의 초기값으로부터 직접적으로 프로퍼티를
상속받습니다. Generator 인스턴스는 %GeneratorPrototype% 으로부터 간접적으로
프로퍼티를 상속받습니다.
27.5.1 %GeneratorPrototype% 객체
%GeneratorPrototype% 객체:
%GeneratorFunction.prototype.prototype% 이다.
일반
객체 이다.
Generator 인스턴스가 아니며, [[GeneratorState]] 내부 슬롯을 갖지 않는다.
[[Prototype]] 내부 슬롯의 값은 %Iterator.prototype% 이다.
모든 Generator 인스턴스가 간접적으로 상속받는 프로퍼티를 갖는다.
27.5.1.1 %GeneratorPrototype%.constructor
%GeneratorPrototype% .constructor의
초기값은 %GeneratorFunction.prototype% 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.5.1.2 %GeneratorPrototype%.next ( value )
? GeneratorResume (this
값, value , empty )를 반환한다.
27.5.1.3 %GeneratorPrototype%.return ( value )
이 메서드는 호출 시 다음 단계들을 수행합니다:
g 에 this 값을 할당한다.
C 에 ReturnCompletion (value )를
할당한다.
? GeneratorResumeAbrupt (g ,
C , empty )를 반환한다.
27.5.1.4 %GeneratorPrototype%.throw ( exception )
이 메서드는 호출 시 다음 단계들을 수행합니다:
g 에 this 값을 할당한다.
C 에 ThrowCompletion (exception )를
할당한다.
? GeneratorResumeAbrupt (g ,
C , empty )를 반환한다.
27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기값은 문자열
"Generator" 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.5.2 Generator 인스턴스의 속성
Generator 인스턴스는 표 93 에 기술된 내부 슬롯들과 함께
처음 생성됩니다.
표 93: Generator 인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[GeneratorState]]
suspended-start ,
suspended-yield , executing , 또는
completed
현재 generator의 실행 상태입니다.
[[GeneratorContext]]
실행 컨텍스트
이 generator의 코드를 실행할 때 사용되는 실행
컨텍스트 입니다.
[[GeneratorBrand]]
문자열 또는 empty
다양한 종류의 generator를 구분하는 데 사용되는 brand입니다. ECMAScript 소스
텍스트 에서 선언된 generator의 [[GeneratorBrand]] 는 항상
empty 입니다.
27.5.3 Generator 추상 연산
27.5.3.1 GeneratorStart ( generator ,
generatorBody )
GeneratorStart 추상 연산은 generator (Generator)와 generatorBody (FunctionBody 파싱
노드 또는 파라미터 없는 추상 클로저 )를 인수로 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[GeneratorState]] 가
suspended-start 임을 보장한다.
genContext 에 실행 중인 실행
컨텍스트 를 할당한다.
genContext 의 Generator 컴포넌트를 generator 로 설정한다.
closure 에 파라미터 없이 generatorBody 를 캡처하고 호출 시 다음 단계들을 수행하는 새로운
추상 클로저 를 할당한다:
acGenContext 에 실행 중인 실행
컨텍스트 를 할당한다.
acGenerator 에 acGenContext 의 Generator 컴포넌트를 할당한다.
generatorBody 가 파싱 노드 이면,
result 에 Completion (Evaluation of
generatorBody )를 할당한다.
그 밖의 경우,
Assert :
generatorBody 는 파라미터 없는 추상 클로저 이어야 한다.
result 에 Completion (generatorBody ())를
할당한다.
Assert : 여기서 반환된다면 generator는 예외를
throw했거나 암시적 또는 명시적 return을 수행한 것이다.
acGenContext 를 실행 컨텍스트
스택 에서 제거하고, 실행 컨텍스트
스택 의 최상단에 있는 실행
컨텍스트 를 실행 중인 실행
컨텍스트 로 복원한다.
acGenerator .[[GeneratorState]] 를
completed 로 설정한다.
참고: generator가 completed 상태에 들어가면 다시 그 상태를 벗어나지 않으며,
관련된 실행 컨텍스트 도 다시 재개되지 않는다.
이 시점에서 acGenerator 와 관련된 실행 상태는 버려질 수 있다.
result 가 정상 종료(normal
completion) 이면,
resultValue 에 undefined 를 할당한다.
result 가 return
completion 이면,
resultValue 에 result .[[Value]] 를 할당한다.
그 밖의 경우,
Assert : result 는
throw
completion 이어야 한다.
? result 를 반환한다.
NormalCompletion (CreateIteratorResultObject (resultValue ,
true ))를 반환한다.
genContext 의 코드 평가 상태를 조정하여 해당 실행 컨텍스트 가 재개될 때
closure 가 인자 없이 호출되도록 한다.
generator .[[GeneratorContext]] 를
genContext 로 설정한다.
unused 를 반환한다.
27.5.3.2 GeneratorValidate ( generator ,
generatorBrand )
GeneratorValidate 추상 연산은 generator (ECMAScript 언어 값 )와
generatorBrand (문자열 또는 empty )를 인수로 받아
suspended-start , suspended-yield ,
completed 중 하나를 담은 정상 종료(normal
completion) 또는 throw completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (generator ,
[[GeneratorState]] )를 수행한다.
? RequireInternalSlot (generator ,
[[GeneratorBrand]] )를 수행한다.
generator .[[GeneratorBrand]] 가
generatorBrand 와 다르면 TypeError 예외를 throw한다.
Assert :
generator 는 [[GeneratorContext]] 내부 슬롯도 가져야 한다.
state 에 generator .[[GeneratorState]] 를
할당한다.
state 가 executing 이면, TypeError
예외를 throw한다.
state 를 반환한다.
27.5.3.3 GeneratorResume ( generator ,
value , generatorBrand )
GeneratorResume 추상 연산은 generator (ECMAScript 언어
값 ), value (ECMAScript 언어 값
또는 empty ), generatorBrand (문자열 또는
empty )를 인수로 받아 ECMAScript 언어 값 를
담은 정상 종료(normal
completion) 또는 throw completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
state 에 ? GeneratorValidate (generator ,
generatorBrand )를 할당한다.
state 가 completed 이면, CreateIteratorResultObject (undefined ,
true )를 반환한다.
Assert :
state 는 suspended-start 또는
suspended-yield 이어야 한다.
genContext 에 generator .[[GeneratorContext]] 를 할당한다.
methodContext 에 실행 중인 실행
컨텍스트 를 할당한다.
methodContext 를 중단(suspend)한다.
generator .[[GeneratorState]] 를
executing 로 설정한다.
genContext 를 실행 컨텍스트 스택 에 푸시(push)한다;
genContext 는 이제 실행 중인 실행
컨텍스트 이다.
genContext 의 중단된 평가를 재개한다 NormalCompletion (value )를
중단의 결과로 사용한다. result 에 재개된 계산의 반환값을 할당한다.
Assert :
여기서 반환될 때 genContext 는 이미 실행 컨텍스트 스택 에서
제거되었고 methodContext 가 현재 실행 중인 실행
컨텍스트 이다.
? result 를 반환한다.
27.5.3.4 GeneratorResumeAbrupt ( generator ,
abruptCompletion , generatorBrand )
GeneratorResumeAbrupt 추상 연산은 generator (ECMAScript 언어 값 ),
abruptCompletion (return
completion 또는 throw completion ),
generatorBrand (문자열 또는 empty )를 인수로 받아 ECMAScript 언어 값 를 담은 정상 종료(normal
completion) 또는 throw completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
state 에 ? GeneratorValidate (generator ,
generatorBrand )를 할당한다.
state 가 suspended-start 이면,
generator .[[GeneratorState]] 를
completed 로 설정한다.
참고: generator가 completed 상태에 들어가면 다시 그 상태를 벗어나지 않으며,
관련된 실행 컨텍스트 도 다시 재개되지 않는다.
이 시점에서 generator 와 관련된 실행 상태는 버려질 수 있다.
state 를 completed 로 설정한다.
state 가 completed 이면,
abruptCompletion 이 return
completion 이면,
CreateIteratorResultObject (abruptCompletion .[[Value]] , true )를 반환한다.
? abruptCompletion 를 반환한다.
Assert :
state 는 suspended-yield 이어야 한다.
genContext 에 generator .[[GeneratorContext]] 를 할당한다.
methodContext 에 실행 중인 실행
컨텍스트 를 할당한다.
methodContext 를 중단(suspend)한다.
generator .[[GeneratorState]] 를
executing 로 설정한다.
genContext 를 실행 컨텍스트 스택 에 푸시(push)한다;
genContext 는 이제 실행 중인 실행
컨텍스트 이다.
genContext 의 중단된 평가를 재개한다 중단의 결과로
abruptCompletion 을 사용한다. result 에 재개된 계산이 반환한 Completion
Record 를 할당한다.
Assert :
여기서 반환될 때 genContext 는 이미 실행 컨텍스트 스택 에서
제거되었고 methodContext 가 현재 실행 중인 실행
컨텍스트 이다.
? result 를 반환한다.
27.5.3.5 GetGeneratorKind ( )
GetGeneratorKind 추상 연산은 인수를 받지 않으며 non-generator ,
sync , async 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:
genContext 에 실행 중인 실행
컨텍스트 를 할당한다.
genContext 에 Generator 컴포넌트가 없으면 non-generator 를
반환한다.
generator 에 genContext 의 Generator 컴포넌트를 할당한다.
generator 에 [[AsyncGeneratorState]] 내부 슬롯이 있으면
async 를 반환한다.
그 밖의 경우 sync 를 반환한다.
27.5.3.6 GeneratorYield ( iteratorResult )
GeneratorYield 추상 연산은 iteratorResult (IteratorResult 인터페이스 를 따르는 객체)를
인수로 받아 ECMAScript 언어 값 를 담은 정상 종료(normal
completion) 또는 비정상 종료(abrupt
completion) 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
genContext 에 실행 중인 실행
컨텍스트 를 할당한다.
Assert :
genContext 는 generator의 실행 컨텍스트 이어야 한다.
generator 에 genContext 의 Generator 컴포넌트를 할당한다.
Assert :
GetGeneratorKind ()가
sync 임을 보장한다.
generator .[[GeneratorState]] 를
suspended-yield 로 설정한다.
genContext 를 실행 컨텍스트 스택 에서 제거하고, 실행 컨텍스트 스택 의 최상단에 있는 실행 컨텍스트 를 실행 중인 실행 컨텍스트 로 복원한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
NormalCompletion (iteratorResult )를
전달하여 callerContext 를 재개한다. genContext 가 다시 재개된다면
resumptionValue 에 재개 시 전달된 Completion
Record 를 할당한다.
Assert :
여기까지 도달했다면 genContext 는 다시 실행 중인 실행
컨텍스트 가 되었다.
resumptionValue 를 반환한다.
27.5.3.7 Yield ( value )
Yield 추상 연산은 value (ECMAScript 언어
값 )를 인수로 받아 ECMAScript 언어 값 를
담은 정상 종료(normal
completion) 또는 비정상 종료(abrupt
completion) 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
generatorKind 에 GetGeneratorKind ()를 할당한다.
generatorKind 가 async 이면, ? AsyncGeneratorYield (? Await (value ))를 반환한다.
그 밖의 경우, ? GeneratorYield (CreateIteratorResultObject (value ,
false ))를 반환한다.
27.5.3.8 CreateIteratorFromClosure ( closure ,
generatorBrand , generatorPrototype [ , extraSlots ] )
CreateIteratorFromClosure 추상 연산은 closure (파라미터 없는 추상
클로저 ), generatorBrand (문자열 또는
empty ), generatorPrototype (객체), 선택적 인수
extraSlots (내부 슬롯 이름의
리스트 )를 받아 Generator를 반환합니다. 호출 시 다음 단계들을 수행합니다:
참고: closure 는 Yield 연산을 사용하여 IteratorResult 객체 를
yield할 수 있습니다.
extraSlots 가 제공되지 않았다면, extraSlots 를 새로운 빈 리스트 로 설정한다.
internalSlotsList 에 extraSlots 와 « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] »의 리스트 연결 결과를 할당한다.
generator 에 OrdinaryObjectCreate (generatorPrototype ,
internalSlotsList )를 할당한다.
generator .[[GeneratorBrand]] 를
generatorBrand 로 설정한다.
generator .[[GeneratorState]] 를
suspended-start 로 설정한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
calleeContext 에 새로운 실행 컨텍스트 를 할당한다.
calleeContext 의 Function을 null 로 설정한다.
calleeContext 의 Realm 을 현재 Realm Record 로 설정한다.
calleeContext 의 ScriptOrModule을 callerContext 의 ScriptOrModule로
설정한다.
callerContext 가 이미 중단 상태가 아니라면 callerContext 를 중단(suspend)한다.
calleeContext 를 실행 컨텍스트 스택 에
푸시(push)한다; calleeContext 는 이제 실행 중인 실행
컨텍스트 이다.
GeneratorStart (generator ,
closure )를 수행한다.
calleeContext 를 실행 컨텍스트 스택 에서
제거하고 callerContext 를 실행 중인 실행
컨텍스트 로 복원한다.
generator 를 반환한다.
27.6 AsyncGenerator 객체
AsyncGenerator는 async generator 함수를 호출하여 생성되며 async 이터레이터 인터페이스 와
async 이터러블 인터페이스 모두를 따릅니다.
AsyncGenerator 인스턴스는 인스턴스를 생성한 async generator 함수의 "prototype" 프로퍼티의 초기값으로부터 직접적으로
프로퍼티를 상속받습니다. AsyncGenerator 인스턴스는 %AsyncGeneratorPrototype% 으로부터
간접적으로 프로퍼티를 상속받습니다.
27.6.1 %AsyncGeneratorPrototype% 객체
%AsyncGeneratorPrototype% 객체:
%AsyncGeneratorFunction.prototype.prototype% 이다.
일반
객체 이다.
AsyncGenerator 인스턴스가 아니며, [[AsyncGeneratorState]] 내부 슬롯을 갖지 않는다.
[[Prototype]] 내부 슬롯의 값은 %AsyncIteratorPrototype% 이다.
모든 AsyncGenerator 인스턴스가 간접적으로 상속받는 프로퍼티를 갖는다.
27.6.1.1 %AsyncGeneratorPrototype%.constructor
%AsyncGeneratorPrototype% .constructor의
초기값은 %AsyncGeneratorFunction.prototype% 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.6.1.2 %AsyncGeneratorPrototype%.next ( value )
generator 에 this 값을 할당한다.
promiseCapability 에 ! NewPromiseCapability (%Promise% )를 할당한다.
result 에 Completion (AsyncGeneratorValidate (generator ,
empty ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
state 에 generator .[[AsyncGeneratorState]] 를 할당한다.
state 가 completed 이면,
iteratorResult 에 CreateIteratorResultObject (undefined ,
true )를 할당한다.
! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
completion 에 NormalCompletion (value )를
할당한다.
AsyncGeneratorEnqueue (generator ,
completion , promiseCapability )를 수행한다.
state 가 suspended-start 또는
suspended-yield 이면,
AsyncGeneratorResume (generator ,
completion )를 수행한다.
그 밖의 경우,
Assert : state 는
executing 또는 draining-queue 이어야
한다.
promiseCapability .[[Promise]] 를 반환한다.
27.6.1.3 %AsyncGeneratorPrototype%.return ( value )
generator 에 this 값을 할당한다.
promiseCapability 에 ! NewPromiseCapability (%Promise% )를 할당한다.
result 에 Completion (AsyncGeneratorValidate (generator ,
empty ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
completion 에 ReturnCompletion (value )를
할당한다.
AsyncGeneratorEnqueue (generator ,
completion , promiseCapability )를 수행한다.
state 에 generator .[[AsyncGeneratorState]] 를 할당한다.
state 가 suspended-start 또는
completed 이면,
generator .[[AsyncGeneratorState]] 를
draining-queue 로 설정한다.
AsyncGeneratorAwaitReturn (generator )를
수행한다.
그 밖의 경우 state 가 suspended-yield 이면,
AsyncGeneratorResume (generator ,
completion )를 수행한다.
그 밖의 경우,
Assert : state 는
executing 또는 draining-queue 이어야
한다.
promiseCapability .[[Promise]] 를 반환한다.
27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception
)
generator 에 this 값을 할당한다.
promiseCapability 에 ! NewPromiseCapability (%Promise% )를 할당한다.
result 에 Completion (AsyncGeneratorValidate (generator ,
empty ))를 할당한다.
IfAbruptRejectPromise (result ,
promiseCapability )를 수행한다.
state 에 generator .[[AsyncGeneratorState]] 를 할당한다.
state 가 suspended-start 이면,
generator .[[AsyncGeneratorState]] 를
completed 로 설정한다.
state 를 completed 로 설정한다.
state 가 completed 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
exception »)를 수행한다.
promiseCapability .[[Promise]] 를 반환한다.
completion 에 ThrowCompletion (exception )를
할당한다.
AsyncGeneratorEnqueue (generator ,
completion , promiseCapability )를 수행한다.
state 가 suspended-yield 이면,
AsyncGeneratorResume (generator ,
completion )를 수행한다.
그 밖의 경우,
Assert : state 는
executing 또는 draining-queue 이어야
한다.
promiseCapability .[[Promise]] 를 반환한다.
27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기값은 문자열
"AsyncGenerator" 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.6.2 AsyncGenerator 인스턴스의 속성
AsyncGenerator 인스턴스는 아래에 기술된 내부 슬롯들과 함께 처음 생성됩니다:
표 94: AsyncGenerator 인스턴스의 내부 슬롯
내부 슬롯
타입
설명
[[AsyncGeneratorState]]
suspended-start ,
suspended-yield , executing ,
draining-queue , 또는 completed
현재 async generator의 실행 상태입니다.
[[AsyncGeneratorContext]]
실행 컨텍스트
이 async generator의 코드를 실행할 때 사용되는 실행
컨텍스트 입니다.
[[AsyncGeneratorQueue]]
리스트
(AsyncGeneratorRequest
레코드 의
리스트)
레코드 로,
async generator를 재개하기 위한 요청을 나타냅니다. 상태 전이 중이 아닌 경우, [[AsyncGeneratorState]] 가
executing 또는 draining-queue 일
때만 비어 있지 않습니다.
[[GeneratorBrand]]
문자열 또는 empty
다양한 종류의 async generator를 구분하는 데 사용되는 brand입니다. ECMAScript 소스 텍스트 에서 선언된 async
generator의 [[GeneratorBrand]] 는 항상
empty 입니다.
27.6.3 AsyncGenerator 추상 연산
27.6.3.1 AsyncGeneratorRequest 레코드
AsyncGeneratorRequest 는 async
generator가 어떻게 재개되어야 하는지에 대한 정보를 저장하기 위해 사용되는 레코드 값이며, 해당 promise를
이행하거나 거부하는 데 필요한 capability를 포함합니다.
다음 필드를 가집니다:
표 95: AsyncGeneratorRequest 레코드 필드
27.6.3.2 AsyncGeneratorStart ( generator ,
generatorBody )
AsyncGeneratorStart 추상 연산은 generator (AsyncGenerator)와 generatorBody
(FunctionBody 파싱
노드 또는 파라미터 없는 추상 클로저 )를 인수로 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[AsyncGeneratorState]] 가
suspended-start 임을 보장한다.
genContext 에 실행 중인 실행
컨텍스트 를 할당한다.
genContext 의 Generator 컴포넌트를 generator 로 설정한다.
closure 에 파라미터 없이 generatorBody 를 캡처하고 호출 시 다음 단계들을 수행하는 새로운
추상 클로저 를 할당한다:
acGenContext 에 실행 중인 실행
컨텍스트 를 할당한다.
acGenerator 에 acGenContext 의 Generator 컴포넌트를 할당한다.
generatorBody 가 파싱 노드 이면,
result 에 Completion (Evaluation of
generatorBody )를 할당한다.
그 밖의 경우,
Assert :
generatorBody 는 파라미터 없는 추상 클로저 이어야 한다.
result 에 Completion (generatorBody ())를
할당한다.
Assert : 여기서 반환된다면 async generator는 예외를
throw했거나 암시적 또는 명시적 return을 수행한 것이다.
acGenContext 를 실행 컨텍스트
스택 에서 제거하고, 실행 컨텍스트
스택 의 최상단에 있는 실행
컨텍스트 를 실행 중인 실행
컨텍스트 로 복원한다.
acGenerator .[[AsyncGeneratorState]] 를
draining-queue 로 설정한다.
result 가 정상 종료(normal
completion) 이면, result 를 NormalCompletion (undefined )로
설정한다.
result 가 return
completion 이면, result 를 NormalCompletion (result .[[Value]] )로 설정한다.
AsyncGeneratorCompleteStep (acGenerator ,
result , true )를 수행한다.
AsyncGeneratorDrainQueue (acGenerator )를
수행한다.
NormalCompletion (undefined )를
반환한다.
genContext 의 코드 평가 상태를 조정하여 해당 실행 컨텍스트 가 재개될 때
closure 가 인자 없이 호출되도록 한다.
generator .[[AsyncGeneratorContext]] 를
genContext 로 설정한다.
generator .[[AsyncGeneratorQueue]] 를 새로운 빈
리스트 로 설정한다.
unused 를 반환한다.
27.6.3.3 AsyncGeneratorValidate ( generator ,
generatorBrand )
AsyncGeneratorValidate 추상 연산은 generator (ECMAScript 언어 값 )와
generatorBrand (문자열 또는 empty )를 인수로 받아
unused 를 담은 정상 종료(normal
completion) 또는 throw completion 를
반환합니다. 호출 시 다음 단계들을 수행합니다:
? RequireInternalSlot (generator ,
[[AsyncGeneratorContext]] )를 수행한다.
? RequireInternalSlot (generator ,
[[AsyncGeneratorState]] )를 수행한다.
? RequireInternalSlot (generator ,
[[AsyncGeneratorQueue]] )를 수행한다.
generator .[[GeneratorBrand]] 가
generatorBrand 와 다르면 TypeError 예외를 throw한다.
unused 를 반환한다.
27.6.3.4 AsyncGeneratorEnqueue ( generator ,
completion , promiseCapability )
AsyncGeneratorEnqueue 추상 연산은 generator (AsyncGenerator), completion
(Completion Record ),
promiseCapability (PromiseCapability
Record )를 인수로 받아 unused 를 반환합니다. 호출 시 다음 단계들을
수행합니다:
request 에 AsyncGeneratorRequest
{ [[Completion]] : completion , [[Capability]] : promiseCapability }를 할당한다.
request 를 generator .[[AsyncGeneratorQueue]] 에 추가한다.
unused 를 반환한다.
27.6.3.5 AsyncGeneratorCompleteStep ( generator ,
completion , done [ , realm ] )
AsyncGeneratorCompleteStep 추상 연산은 generator (AsyncGenerator),
completion (Completion
Record ), done (불리언), 선택적 인수 realm (Realm
Record )를 받아 unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[AsyncGeneratorQueue]] 는 비어 있지 않아야 한다.
next 에 generator .[[AsyncGeneratorQueue]] 의 첫 번째 요소를 할당한다.
generator .[[AsyncGeneratorQueue]] 에서 첫 번째 요소를
제거한다.
promiseCapability 에 next .[[Capability]] 를 할당한다.
value 에 completion .[[Value]] 를 할당한다.
completion 이 throw
completion 이면,
! Call (promiseCapability .[[Reject]] , undefined , «
value »)를 수행한다.
그 밖의 경우,
Assert : completion 은
정상
종료(normal completion) 이어야 한다.
realm 이 존재하면,
oldRealm 에 실행 중인 실행
컨텍스트 의 Realm 를 할당한다.
실행 중인 실행
컨텍스트 의 Realm 를
realm 으로 설정한다.
iteratorResult 에 CreateIteratorResultObject (value ,
done )를 할당한다.
실행 중인 실행
컨텍스트 의 Realm 를
oldRealm 으로 복원한다.
그 밖의 경우,
iteratorResult 에 CreateIteratorResultObject (value ,
done )를 할당한다.
! Call (promiseCapability .[[Resolve]] , undefined , «
iteratorResult »)를 수행한다.
unused 를 반환한다.
27.6.3.6 AsyncGeneratorResume ( generator ,
completion )
AsyncGeneratorResume 추상 연산은 generator (AsyncGenerator)와 completion
(Completion Record )를
인수로 받아 unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[AsyncGeneratorState]] 가
suspended-start 또는 suspended-yield 이어야
한다.
genContext 에 generator .[[AsyncGeneratorContext]] 를 할당한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
callerContext 를 중단(suspend)한다.
generator .[[AsyncGeneratorState]] 를
executing 로 설정한다.
genContext 를 실행 컨텍스트 스택 에 푸시(push)한다;
genContext 는 이제 실행 중인 실행
컨텍스트 이다.
genContext 의 중단된 평가를 재개한다 , 중단의 결과로
completion 을 사용한다. result 에 재개된 계산이 반환한 Completion
Record 를 할당한다.
Assert :
result 는 비정상
종료(abrupt completion) 가 아니어야 한다.
Assert :
여기서 반환될 때 genContext 는 이미 실행 컨텍스트 스택 에서
제거되었고 callerContext 가 현재 실행 중인 실행
컨텍스트 이다.
unused 를 반환한다.
27.6.3.7 AsyncGeneratorUnwrapYieldResumption (
resumptionValue )
AsyncGeneratorUnwrapYieldResumption 추상 연산은 resumptionValue (Completion Record )를
인수로 받아 ECMAScript 언어 값 를 담은 정상 종료(normal
completion) 또는 비정상 종료(abrupt
completion) 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
resumptionValue 가 return
completion 이 아니면, ? resumptionValue 를 반환한다.
awaited 에 Completion (Await (resumptionValue .[[Value]] ))를 할당한다.
awaited 가 throw
completion 이면, ? awaited 를 반환한다.
Assert :
awaited 는 정상 종료(normal
completion) 이어야 한다.
ReturnCompletion (awaited .[[Value]] )를 반환한다.
27.6.3.8 AsyncGeneratorYield ( value )
AsyncGeneratorYield 추상 연산은 value (ECMAScript 언어
값 )를 인수로 받아 ECMAScript 언어 값 를
담은 정상 종료(normal
completion) 또는 비정상 종료(abrupt
completion) 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
genContext 에 실행 중인 실행
컨텍스트 를 할당한다.
Assert :
genContext 는 generator의 실행 컨텍스트 이어야 한다.
generator 에 genContext 의 Generator 컴포넌트를 할당한다.
Assert :
GetGeneratorKind ()가
async 임을 보장한다.
completion 에 NormalCompletion (value )를
할당한다.
Assert :
실행 컨텍스트 스택 에는 최소 두 개의 요소가 있어야
한다.
previousContext 에 실행 컨텍스트 스택 의 두
번째(top에서 두 번째) 요소를 할당한다.
previousRealm 에 previousContext 의 Realm 를 할당한다.
AsyncGeneratorCompleteStep (generator ,
completion , false , previousRealm )를 수행한다.
queue 에 generator .[[AsyncGeneratorQueue]] 를 할당한다.
queue 가 비어 있지 않으면,
참고: 실행은 generator를 중단하지 않고 계속된다.
toYield 에 queue 의 첫 번째 요소를 할당한다.
resumptionValue 에 Completion (toYield .[[Completion]] )를 할당한다.
? AsyncGeneratorUnwrapYieldResumption (resumptionValue )를
반환한다.
그 밖의 경우,
generator .[[AsyncGeneratorState]] 를
suspended-yield 로 설정한다.
genContext 를 실행 컨텍스트
스택 에서 제거하고, 실행 컨텍스트
스택 의 최상단에 있는 실행
컨텍스트 를 실행 중인 실행
컨텍스트 로 복원한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
callerContext 를 undefined 를 전달하여 재개한다.
genContext 가 다시 재개된다면 resumptionValue 에 재개 시 전달된
Completion
Record 를 할당한다.
Assert : 여기까지 도달했다면
genContext 는 다시 실행 중인 실행
컨텍스트 가 되었다.
? AsyncGeneratorUnwrapYieldResumption (resumptionValue )를
반환한다.
27.6.3.9 AsyncGeneratorAwaitReturn ( generator )
AsyncGeneratorAwaitReturn 추상 연산은 generator (AsyncGenerator)를 인수로 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[AsyncGeneratorState]] 가
draining-queue 임을 보장한다.
queue 에 generator .[[AsyncGeneratorQueue]] 를 할당한다.
Assert :
queue 는 비어 있지 않아야 한다.
next 에 queue 의 첫 번째 요소를 할당한다.
completion 에 Completion (next .[[Completion]] )를 할당한다.
Assert :
completion 은 return
completion 이어야 한다.
promiseCompletion 에 Completion (PromiseResolve (%Promise% ,
completion .[[Value]] ))를 할당한다.
promiseCompletion 이 비정상 종료(abrupt
completion) 이면,
AsyncGeneratorCompleteStep (generator ,
promiseCompletion , true )를 수행한다.
AsyncGeneratorDrainQueue (generator )를
수행한다.
unused 를 반환한다.
Assert :
promiseCompletion 은 정상 종료(normal
completion) 이어야 한다.
promise 에 promiseCompletion .[[Value]] 를
할당한다.
fulfilledClosure 에 파라미터 (value )를 가지며 generator 를 캡처하고
호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
Assert : generator .[[AsyncGeneratorState]] 가
draining-queue 임을 보장한다.
result 에 NormalCompletion (value )를
할당한다.
AsyncGeneratorCompleteStep (generator ,
result , true )를 수행한다.
AsyncGeneratorDrainQueue (generator )를
수행한다.
NormalCompletion (undefined )를
반환한다.
onFulfilled 에 CreateBuiltinFunction (fulfilledClosure ,
1, "" , « »)를 할당한다.
rejectedClosure 에 파라미터 (reason )를 가지며 generator 를 캡처하고
호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
Assert : generator .[[AsyncGeneratorState]] 가
draining-queue 임을 보장한다.
result 에 ThrowCompletion (reason )를
할당한다.
AsyncGeneratorCompleteStep (generator ,
result , true )를 수행한다.
AsyncGeneratorDrainQueue (generator )를
수행한다.
NormalCompletion (undefined )를
반환한다.
onRejected 에 CreateBuiltinFunction (rejectedClosure ,
1, "" , « »)를 할당한다.
PerformPromiseThen (promise ,
onFulfilled , onRejected )를 수행한다.
unused 를 반환한다.
27.6.3.10 AsyncGeneratorDrainQueue ( generator )
AsyncGeneratorDrainQueue 추상 연산은 generator (AsyncGenerator)를 인수로 받아
unused 를 반환합니다. 이 연산은 generator의 AsyncGeneratorQueue를 AsyncGeneratorRequest 가
return completion 을
갖는 경우까지 소진(draining)합니다. 호출 시 다음 단계들을 수행합니다:
Assert :
generator .[[AsyncGeneratorState]] 가
draining-queue 임을 보장한다.
queue 에 generator .[[AsyncGeneratorQueue]] 를 할당한다.
queue 가 비어 있지 않은 동안 반복한다,
next 에 queue 의 첫 번째 요소를 할당한다.
completion 에 Completion (next .[[Completion]] )를 할당한다.
completion 이 return
completion 이면,
AsyncGeneratorAwaitReturn (generator )를
수행한다.
unused 를 반환한다.
그 밖의 경우,
completion 이 정상
종료(normal completion) 이면,
completion 을 NormalCompletion (undefined )로
설정한다.
AsyncGeneratorCompleteStep (generator ,
completion , true )를 수행한다.
generator .[[AsyncGeneratorState]] 를
completed 로 설정한다.
unused 를 반환한다.
27.6.3.11 CreateAsyncIteratorFromClosure ( closure ,
generatorBrand , generatorPrototype )
CreateAsyncIteratorFromClosure 추상 연산은 closure (파라미터 없는 추상
클로저 ), generatorBrand (문자열 또는
empty ), generatorPrototype (객체)를 인수로 받아 AsyncGenerator를
반환합니다. 호출 시 다음 단계들을 수행합니다:
참고: closure 는 Await 연산과 Yield 연산을 사용하여 IteratorResult 객체 를
yield할 수 있습니다.
internalSlotsList 에 « [[AsyncGeneratorState]] ,
[[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] »를 할당한다.
generator 에 OrdinaryObjectCreate (generatorPrototype ,
internalSlotsList )를 할당한다.
generator .[[GeneratorBrand]] 를
generatorBrand 로 설정한다.
generator .[[AsyncGeneratorState]] 를
suspended-start 로 설정한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
calleeContext 에 새로운 실행 컨텍스트 를 할당한다.
calleeContext 의 Function을 null 로 설정한다.
calleeContext 의 Realm 을 현재 Realm Record 로 설정한다.
calleeContext 의 ScriptOrModule을 callerContext 의 ScriptOrModule로
설정한다.
callerContext 가 이미 중단 상태가 아니라면 callerContext 를 중단(suspend)한다.
calleeContext 를 실행 컨텍스트 스택 에
푸시(push)한다; calleeContext 는 이제 실행 중인 실행
컨텍스트 이다.
AsyncGeneratorStart (generator ,
closure )를 수행한다.
calleeContext 를 실행 컨텍스트 스택 에서
제거하고 callerContext 를 실행 중인 실행
컨텍스트 로 복원한다.
generator 를 반환한다.
27.7 AsyncFunction 객체
AsyncFunction은 일반적으로 AsyncFunctionDeclaration , AsyncFunctionExpression ,
AsyncMethod , AsyncArrowFunction 를 평가함으로써 생성되는
함수입니다. 또한 %AsyncFunction% 내장 객체를 호출하여 생성될 수
있습니다.
27.7.1 AsyncFunction 생성자
AsyncFunction 생성자 :
%AsyncFunction% 이다.
Function의 서브클래스이다.
함수로 호출될 때 새로운 AsyncFunction을 생성 및 초기화한다. 즉, AsyncFunction(…) 함수 호출은 같은 인자를 가진
new AsyncFunction(…) 객체 생성 표현과 동일하다.
클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 AsyncFunction 동작을 상속하고자 하는 서브클래스 생성자 는 내장
AsyncFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 AsyncFunction 생성자 에 대한
super 호출을 포함해야 한다. ECMAScript의 모든 async 함수 객체 정의 구문은 AsyncFunction의 직접
인스턴스를 생성한다. AsyncFunction 서브클래스의 인스턴스를 생성하는 구문은 존재하지 않는다.
27.7.1.1 AsyncFunction ( ...parameterArgs ,
bodyArg )
마지막 인수(있다면)는 async 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.
이 함수는 호출 시 다음 단계들을 수행한다:
C 에 활성 함수 객체 를 할당한다.
bodyArg 가 없으면, bodyArg 를 빈 문자열로 설정한다.
? CreateDynamicFunction (C ,
NewTarget, async , parameterArgs ,
bodyArg )를 반환한다.
참고
자세한 내용은
20.2.1.1 의 NOTE를
참고.
27.7.2 AsyncFunction 생성자의 속성
AsyncFunction 생성자 :
Function 생성자 로부터 상속받는 표준 내장 함수
객체 이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function% 이다.
"length" 프로퍼티 값은
1 𝔽 이다.
"name" 프로퍼티 값은 "AsyncFunction" 이다.
다음 프로퍼티를 가진다:
27.7.2.1 AsyncFunction.prototype
AsyncFunction.prototype의 초기 값은 AsyncFunction 프로토타입
객체 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } 이다.
27.7.3 AsyncFunction 프로토타입 객체의 속성
AsyncFunction 프로토타입 객체 :
27.7.3.1 AsyncFunction.prototype.constructor
AsyncFunction.prototype.constructor의 초기 값은 %AsyncFunction% 이다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 이다.
27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열
"AsyncFunction" 입니다.
이 프로퍼티의 특성은 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 입니다.
27.7.4 AsyncFunction 인스턴스
모든 AsyncFunction 인스턴스는 ECMAScript 함수 객체 이며, 표 30 에 명시된 내부
슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은
false 입니다. AsyncFunction 인스턴스는 생성자 가 아니며 [[Construct]] 내부 메서드를 가지지 않습니다. AsyncFunction 인스턴스는 생성 불가능하므로 prototype
프로퍼티를 가지지 않습니다.
각 AsyncFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:
27.7.4.1 length
"length" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.1 참조)는 AsyncFunction
인스턴스에도 적용됩니다.
27.7.4.2 name
"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는 AsyncFunction
인스턴스에도 적용됩니다.
27.7.5 Async 함수의 추상 연산
27.7.5.1 AsyncFunctionStart ( promiseCapability ,
asyncFunctionBody )
AsyncFunctionStart 추상 연산은 promiseCapability (PromiseCapability Record )와
asyncFunctionBody (FunctionBody 파싱
노드 , ExpressionBody 파싱
노드 또는 파라미터 없는 추상 클로저 )를 인수로 받아
unused 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
runningContext 에 실행 중인 실행
컨텍스트 를 할당한다.
asyncContext 에 runningContext 의 복사본을 할당한다.
참고: 실행 상태를 복사하는 것은 AsyncBlockStart 가 실행을 재개할 수 있도록
필요합니다. 현재 실행 중인 컨텍스트를 재개하는 것은 잘 정의되지 않습니다.
AsyncBlockStart (promiseCapability ,
asyncFunctionBody , asyncContext )를 수행한다.
unused 를 반환한다.
27.7.5.2 AsyncBlockStart ( promiseCapability ,
asyncBody , asyncContext )
AsyncBlockStart 추상 연산은 promiseCapability (PromiseCapability Record ),
asyncBody (파싱 노드 또는 파라미터 없는 추상
클로저 ), asyncContext (실행
컨텍스트 )를 인수로 받아 unused 를 반환합니다. 호출 시 다음 단계들을
수행합니다:
runningContext 에 실행 중인 실행
컨텍스트 를 할당한다.
closure 에 파라미터 없이 promiseCapability 와 asyncBody 를 캡처하고
호출 시 다음 단계들을 수행하는 새로운 추상 클로저 를 할당한다:
acAsyncContext 에 실행 중인 실행
컨텍스트 를 할당한다.
asyncBody 가 파싱 노드 이면,
result 에 Completion (Evaluation of
asyncBody )를 할당한다.
그 밖의 경우,
Assert : asyncBody 는
파라미터 없는 추상 클로저 이어야 한다.
result 에 Completion (asyncBody ())를
할당한다.
Assert : 여기서 반환된다면 async 함수는 예외를
throw했거나 암시적 또는 명시적 return을 수행한 것이다; 모든 await이 완료됨.
acAsyncContext 를 실행 컨텍스트
스택 에서 제거하고, 실행 컨텍스트
스택 의 최상단에 있는 실행
컨텍스트 를 실행 중인 실행
컨텍스트 로 복원한다.
result 가 정상 종료(normal
completion) 이면,
! Call (promiseCapability .[[Resolve]] , undefined , «
undefined »)를 수행한다.
result 가 return
completion 이면,
! Call (promiseCapability .[[Resolve]] , undefined , «
result .[[Value]] »)를 수행한다.
그 밖의 경우,
Assert : result 는
throw
completion 이어야 한다.
! Call (promiseCapability .[[Reject]] , undefined , «
result .[[Value]] »)를 수행한다.
NormalCompletion (unused )를
반환한다.
asyncContext 의 코드 평가 상태를 조정하여 해당 실행 컨텍스트 가 재개될 때
closure 가 인자 없이 호출되도록 한다.
asyncContext 를 실행 컨텍스트 스택 에
푸시(push)한다; asyncContext 는 이제 실행 중인 실행
컨텍스트 이다.
asyncContext 의 중단된 평가를 재개한다 .
result 에 재개된 계산의 반환값을 할당한다.
Assert :
여기서 반환될 때 asyncContext 는 이미 실행 컨텍스트 스택 에서
제거되었고 runningContext 가 현재 실행 중인 실행
컨텍스트 이다.
Assert :
result 는 정상 종료(normal
completion) 이며 값은 unused 이다. 이 값의 가능한
소스는 Await 또는
async 함수가 아무것도 await하지 않는 경우 위 2.i 단계이다.
unused 를 반환한다.
27.7.5.3 Await ( value )
Await 추상 연산은 value (ECMAScript 언어
값 )를 인수로 받아 ECMAScript 언어 값
또는 empty 를 담은 정상 종료(normal
completion) 또는 비정상 종료(abrupt
completion) 를 반환합니다. 호출 시 다음 단계들을 수행합니다:
asyncContext 에 실행 중인 실행
컨텍스트 를 할당한다.
promise 에 ? PromiseResolve (%Promise% , value )를
할당한다.
fulfilledClosure 에 파라미터 (v )를 가지며 asyncContext 를 캡처하고
호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
prevContext 에 실행 중인 실행
컨텍스트 를 할당한다.
prevContext 를 중단(suspend)한다.
asyncContext 를 실행 컨텍스트
스택 에 푸시(push)한다; asyncContext 는 이제 실행 중인 실행 컨텍스트 이다.
asyncContext 의 중단된 평가를 재개한다 , 중단의
결과로 NormalCompletion (v )를
사용한다.
Assert : 이 단계에 도달하면
asyncContext 는 이미 실행 컨텍스트
스택 에서 제거되었고 prevContext 가 현재 실행 중인 실행 컨텍스트 이다.
NormalCompletion (undefined )를
반환한다.
onFulfilled 에 CreateBuiltinFunction (fulfilledClosure ,
1, "" , « »)를 할당한다.
rejectedClosure 에 파라미터 (reason )를 가지며 asyncContext 를
캡처하고 호출 시 다음을 수행하는 새로운 추상 클로저 를 할당한다:
prevContext 에 실행 중인 실행
컨텍스트 를 할당한다.
prevContext 를 중단(suspend)한다.
asyncContext 를 실행 컨텍스트
스택 에 푸시(push)한다; asyncContext 는 이제 실행 중인 실행 컨텍스트 이다.
asyncContext 의 중단된 평가를 재개한다 , 중단의
결과로 ThrowCompletion (reason )를
사용한다.
Assert : 이 단계에 도달하면
asyncContext 는 이미 실행 컨텍스트
스택 에서 제거되었고 prevContext 가 현재 실행 중인 실행 컨텍스트 이다.
NormalCompletion (undefined )를
반환한다.
onRejected 에 CreateBuiltinFunction (rejectedClosure ,
1, "" , « »)를 할당한다.
PerformPromiseThen (promise ,
onFulfilled , onRejected )를 수행한다.
asyncContext 를 실행 컨텍스트 스택 에서
제거하고, 실행 컨텍스트 스택 의 최상단에 있는 실행 컨텍스트 를 실행 중인 실행 컨텍스트 로 복원한다.
callerContext 에 실행 중인 실행
컨텍스트 를 할당한다.
callerContext 를 empty 를 전달하여 재개한다.
asyncContext 가 다시 재개된다면 completion 에 재개 시 전달된 Completion
Record 를 할당한다.
Assert :
여기까지 도달했다면 asyncContext 는 다시 실행 중인 실행
컨텍스트 가 되었다.
completion 을 반환한다.
28 리플렉션
28.1 Reflect 객체
Reflect 객체는 다음과 같다:
%Reflect% 이다.
"Reflect" 속성의 초기값이며, 이는 글로벌 객체 의 속성이다.
일반
객체 이다.
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype% 이다.
함수
객체 가 아니다.
[[Construct]] 내부 메서드를 가지고 있지 않으므로, new 연산자와 함께 생성자 로 사용할 수 없다.
[[Call]] 내부 메서드를 가지고 있지 않으므로, 함수로 호출될 수 없다.
28.1.1 Reflect.apply ( target , thisArgument ,
argumentsList )
이 함수는 호출될 때 다음 절차를 수행한다:
IsCallable (target )이
false 이면, TypeError 예외를 발생시킨다.
args 를 ? CreateListFromArrayLike (argumentsList )로
한다.
PrepareForTailCall ()를 수행한다.
? Call (target ,
thisArgument , args )을 반환한다.
28.1.2 Reflect.construct ( target ,
argumentsList [ , newTarget ] )
이 함수는 호출될 때 다음 절차를 수행한다:
IsConstructor (target )이
false 이면, TypeError 예외를 발생시킨다.
newTarget 이 없다면, newTarget 을 target 으로 설정한다.
그렇지 않고 IsConstructor (newTarget )이
false 이면, TypeError 예외를 발생시킨다.
args 를 ? CreateListFromArrayLike (argumentsList )로
한다.
? Construct (target , args ,
newTarget )을 반환한다.
28.1.3 Reflect.defineProperty ( target ,
propertyKey , attributes )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
desc 를 ? ToPropertyDescriptor (attributes )로
한다.
? target .[[DefineOwnProperty]] (key ,
desc )를 반환한다.
28.1.4 Reflect.deleteProperty ( target ,
propertyKey )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
? target .[[Delete]] (key )를 반환한다.
28.1.5 Reflect.get ( target , propertyKey [ ,
receiver ] )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
receiver 가 없다면,
receiver 를 target 으로 설정한다.
? target .[[Get]] (key , receiver )를 반환한다.
28.1.6 Reflect.getOwnPropertyDescriptor ( target ,
propertyKey )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
desc 를 ? target .[[GetOwnProperty]] (key )로 한다.
FromPropertyDescriptor (desc )를
반환한다.
28.1.7 Reflect.getPrototypeOf ( target )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
? target .[[GetPrototypeOf]] () 를 반환한다.
28.1.8 Reflect.has ( target , propertyKey )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
? target .[[HasProperty]] (key )를 반환한다.
28.1.9 Reflect.isExtensible ( target )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
? target .[[IsExtensible]] () 를 반환한다.
28.1.10 Reflect.ownKeys ( target )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
keys 를 ? target .[[OwnPropertyKeys]] () 로 한다.
CreateArrayFromList (keys )를
반환한다.
28.1.11 Reflect.preventExtensions ( target )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
? target .[[PreventExtensions]] () 를 반환한다.
28.1.12 Reflect.set ( target , propertyKey ,
V [ , receiver ] )
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
key 를 ? ToPropertyKey (propertyKey )로 한다.
receiver 가 없다면,
receiver 를 target 으로 설정한다.
? target .[[Set]] (key , V ,
receiver )를 반환한다.
28.1.13 Reflect.setPrototypeOf ( target , proto
)
이 함수는 호출될 때 다음 절차를 수행한다:
target 이 객체가 아니면 , TypeError 예외를
발생시킨다.
proto 가 객체가 아니고 null 도 아니라면,
TypeError 예외를 발생시킨다.
? target .[[SetPrototypeOf]] (proto )를 반환한다.
28.1.14 Reflect [ %Symbol.toStringTag% ]
%Symbol.toStringTag% 속성의 초기값은 문자열
"Reflect" 이다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : true }이다.
28.2 프록시 객체
28.2.1 Proxy 생성자
Proxy 생성자 :
%Proxy% 이다.
"Proxy" 속성의 초기값이며, 이는 글로벌 객체 의 속성이다.
생성자 로 호출될
때 새 Proxy 객체를 생성하고 초기화한다.
함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생한다.
28.2.1.1 Proxy ( target , handler )
이 함수는 호출될 때 다음 절차를 수행한다:
NewTarget이 undefined 이면, TypeError 예외를 발생시킨다.
? ProxyCreate (target ,
handler )를 반환한다.
28.2.2 Proxy 생성자의 속성
Proxy 생성자 :
[[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype% 이다.
"prototype" 속성을 가지지 않으며, Proxy 객체는 [[Prototype]]
내부 슬롯의 초기화가 필요하지 않기 때문이다.
다음 속성들을 가진다:
28.2.2.1 Proxy.revocable ( target , handler
)
이 함수는 폐기 가능한(revocable) Proxy 객체를 생성한다.
호출 시 다음 절차를 수행한다:
proxy 를 ? ProxyCreate (target ,
handler )로 한다.
revokerClosure 를 매개변수가 없고 캡처하지 않는 새로운 추상
클로저 로 한다. 이 클로저는 호출 시 다음 절차를 수행한다:
F 를 활성 함수 객체 로 한다.
p 를 F .[[RevocableProxy]] 로 한다.
p 가 null 이면, NormalCompletion (undefined )을
반환한다.
F .[[RevocableProxy]] 를
null 로 설정한다.
Assert : p 는 Proxy 이색 객체 이다.
p .[[ProxyTarget]] 를
null 로 설정한다.
p .[[ProxyHandler]] 를
null 로 설정한다.
NormalCompletion (undefined )을
반환한다.
revoker 를 CreateBuiltinFunction (revokerClosure ,
0, "" , « [[RevocableProxy]] »)로 한다.
revoker .[[RevocableProxy]] 를 proxy 로
설정한다.
result 를 OrdinaryObjectCreate (%Object.prototype% )로
한다.
! CreateDataPropertyOrThrow (result ,
"proxy" , proxy )를 수행한다.
! CreateDataPropertyOrThrow (result ,
"revoke" , revoker )를 수행한다.
result 를 반환한다.
28.3 모듈 네임스페이스 객체
모듈 네임스페이스 객체는 모듈 네임스페이스 이색 객체 로, 모듈의 내보낸 바인딩에 런타임 속성
기반 접근을 제공한다. 모듈 네임스페이스 객체에 대한 생성자 함수는 존재하지 않는다. 대신, 각 모듈이 ImportDeclaration 에 의해 import될 때, 해당 선언이 NameSpaceImport 를 포함한다면 객체가 생성된다.
10.4.6 에서 명시된 속성 외에도, 각 모듈 네임스페이스
객체는 다음 고유 속성을 가진다:
28.3.1 %Symbol.toStringTag%
%Symbol.toStringTag% 속성의 초기값은 문자열
"Module" 이다.
이 속성의 특성은 { [[Writable]] :
false , [[Enumerable]] : false ,
[[Configurable]] : false }이다.
29 메모리 모델
메모리 일관성 모델, 즉 메모리 모델 은 공유 데이터 블록 이벤트 의 가능한 순서를 명시한다.
이는 SharedArrayBuffer를 지원하는 TypedArray 인스턴스를 통해 접근하거나 Atomics 객체의 메서드를 통해 발생한다. 프로그램에 데이터
경쟁(아래 정의됨)이 없다면, 이벤트의 순서는 순차적으로 일관성 있게 나타난다. 즉, 각 에이전트 의 동작들이 교차(interleaving)되는 형태로 보인다. 프로그램에 데이터 경쟁이 존재하면, 공유 메모리
연산의 결과가 순차적으로 일관성 있게 나타나지 않을 수 있다. 예를 들어, 프로그램에서 인과관계를 위반하는 동작이나 놀라운 현상이 나타날 수 있다. 이러한 놀라움은 컴파일러 변환과 CPU
설계(예: 순서가 뒤바뀐 실행, 추측 실행)에서 비롯된다. 메모리 모델은 프로그램이 순차적으로 일관성 있는 동작을 나타내는 정확한 조건과 데이터 경쟁에서 읽힐 수 있는 값의 가능성을
정의한다. 즉, 미정의 동작(undefined behaviour)은 없다.
메모리 모델은 SharedArrayBuffer에 대한 추상 연산 이나
Atomics 객체의 메서드가 평가 중에 도입한 이벤트들에 대한 관계적 제약으로 정의된다.
참고
이 절에서는 SharedArrayBuffer에 대한 추상
연산 이 도입하는 이벤트에 대한 공리적(axiomatic) 모델을 제공한다. 이 모델은 본 명세의 다른 부분과 달리 알고리즘적으로
표현될 수 없음을 강조한다. 추상
연산 에 의해 이벤트가 비결정적으로 도입되는 것은 ECMAScript 평가의 연산적 의미와 메모리 모델의 공리적 의미 사이의
인터페이스이다. 이러한 이벤트의 의미는 평가 중의 모든 이벤트 그래프를 고려하여 정의된다. 이것은 정적 의미론도, 실행 시 의미론도 아니다. 알고리즘적 구현이 입증된 바
없으며, 특정 이벤트 그래프가 허용되는지 아닌지를 결정하는 제약 집합만 존재한다.
29.1 메모리 모델의 기본
공유 메모리 접근(읽기 및 쓰기)은 아래와 같이 두 그룹, 원자적 접근과 데이터 접근으로 나뉜다. 원자적 접근은 순차적으로 일관성 있게 처리된다. 즉, 에이전트
클러스터 의 모든 에이전트 가 엄격한 전체 순서(total ordering)에 동의한다. 비원자적 접근은 모든 에이전트 가 동의하는 엄격한 전체 순서를 가지지 않으며, 즉
순서가 없다.
참고 1
순차적으로 일관성 있는 순서보다 약하고, 무순서보다 강한 release-acquire와 같은 순서는 지원되지 않는다.
공유 데이터 블록 이벤트 는 다음 중 하나이다: ReadSharedMemory , WriteSharedMemory , 또는 ReadModifyWriteSharedMemory 레코드 .
표 96: ReadSharedMemory 이벤트 필드
필드 이름
값
의미
[[Order]]
seq-cst 또는 unordered
이벤트에 대해 메모리 모델 이 보장하는 가장 약한 순서.
[[NoTear]]
불리언
이 이벤트가 동일 범위의 여러 쓰기 이벤트로부터 읽는 것이 허용되는지 여부.
[[Block]]
공유
데이터 블록
이벤트가 동작하는 블록.
[[ByteIndex]]
음이 아닌 정수
[[Block]] 내에서 읽기의 바이트 주소.
[[ElementSize]]
음이 아닌 정수
읽기의 크기.
표 97: WriteSharedMemory 이벤트 필드
필드 이름
값
의미
[[Order]]
seq-cst , unordered , 또는
init
이벤트에 대해 메모리 모델 이 보장하는 가장 약한 순서.
[[NoTear]]
불리언
이 이벤트가 동일 범위의 여러 읽기 이벤트로부터 읽히는 것이 허용되는지 여부.
[[Block]]
공유
데이터 블록
이벤트가 동작하는 블록.
[[ByteIndex]]
음이 아닌 정수
[[Block]] 내에서 쓰기의 바이트 주소.
[[ElementSize]]
음이 아닌 정수
쓰기의 크기.
[[Payload]]
리스트 형태의
바이트
값
다른 이벤트에 의해 읽히도록 리스트 형태의
바이트
값 을 제공한다.
표 98: ReadModifyWriteSharedMemory
이벤트 필드
필드 이름
값
의미
[[Order]]
seq-cst
읽기-수정-쓰기 이벤트는 항상 순차적으로 일관성 있다.
[[NoTear]]
true
읽기-수정-쓰기 이벤트는 찢김(tear)이 발생하지 않는다.
[[Block]]
공유
데이터 블록
이벤트가 동작하는 블록.
[[ByteIndex]]
음이 아닌 정수
[[Block]] 내에서 읽기-수정-쓰기의 바이트 주소.
[[ElementSize]]
음이 아닌 정수
읽기-수정-쓰기의 크기.
[[Payload]]
리스트 형태의
바이트
값
[[ModifyOp]] 에 전달되는 리스트 형태의
바이트
값 .
[[ModifyOp]]
읽기-수정-쓰기 수정 함수
읽은 리스트 형태의
바이트
값 과 [[Payload]] 을 받아 수정된 리스트 형태의
바이트
값 을 반환하는 추상 클로저.
이러한 이벤트는 추상 연산 또는 Atomics 객체의
메서드에 의해 도입된다.
일부 연산은 Synchronize 이벤트도 도입할 수 있다. Synchronize 이벤트 는 필드가 없으며, 오직 다른 이벤트의 허용되는 순서에 직접적으로 제약을 주기 위해 존재한다.
공유 데이터 블록
및 Synchronize 이벤트 외에도 호스트 특화
이벤트가 존재한다.
ReadSharedMemory, WriteSharedMemory, 또는 ReadModifyWriteSharedMemory 이벤트의 range는 [[ByteIndex]] 에서 [[ByteIndex]] + [[ElementSize]] - 1까지의 연속된 정수 집합이다. 두 이벤트의 range가 동일하다는 것은 두 이벤트가 같은 [[Block]] 을 가지고 있고, range가 요소별로 같음을 의미한다. 두 이벤트의 range가 겹친다는 것은 두 이벤트가 같은
[[Block]] 을 가지고 있으나, range가 같지 않으며 그 교집합이 비어 있지 않음을 의미한다. 두 이벤트의 range가
분리(disjoint)된다는 것은 두 이벤트가 같은 [[Block]] 을 가지지 않거나, range가 같지도 겹치지도 않는 경우이다.
참고 2
고려해야 하는 호스트 특화 동기화 이벤트
예시로는: 한 에이전트 에서 다른
에이전트로 SharedArrayBuffer를 보내는 것(예: 브라우저에서 postMessage 사용), 에이전트 의 시작과 종료, 에이전트
클러스터 내에서 공유 메모리 외의 채널을 통해 통신하는 것 등이 있다. 특정 실행 execution 의
경우, 이러한 이벤트는 호스트 가
host-synchronizes-with 엄격 부분 순서(strict partial
order) 를 통해 제공한다.
또한, 호스트 는
execution .[[EventList]] 에 호스트 특화 동기화 이벤트를 추가하여 is-agent-order-before 관계(Relation) 에 참여할 수
있다.
이벤트들은 아래에서 정의된 관계를 통해 후보 실행 내에서 순서가 정해진다.
29.2 에이전트 이벤트 레코드
에이전트 이벤트 레코드 는 다음 필드를 가진 레코드 이다.
표 99: 에이전트 이벤트 레코드 필드
29.3 선택된 값 레코드
선택된 값 레코드 는 다음 필드를 가진 레코드 이다.
표 100: 선택된 값 레코드 필드
29.4 후보 실행
후보 실행 은 에이전트 클러스터 의 평가에 대한 레코드 이며, 다음 필드를 가진다.
표 101: 후보 실행 레코드 필드
빈 후보 실행 은 모든 필드가 빈 리스트 인 후보 실행 레코드 이다.
29.5 메모리 모델을 위한 추상 연산
29.5.1 EventSet ( execution )
추상 연산 EventSet은 인수 execution (후보 실행 )을 받아 이벤트 집합을 반환한다.
호출 시 다음 절차를 수행한다:
events 를 빈 집합으로 한다.
execution .[[EventsRecords]] 의 각 에이전트 이벤트 레코드
aer 에 대해,
aer .[[EventList]] 의 각 이벤트 E 에 대해
E 를 events 에 추가한다.
events 를 반환한다.
29.5.2 SharedDataBlockEventSet ( execution )
추상 연산 SharedDataBlockEventSet은 인수 execution (후보
실행 )을 받아 이벤트 집합을 반환한다. 호출 시 다음 절차를 수행한다:
events 를 빈 집합으로 한다.
EventSet (execution )의 각 이벤트
E 에 대해
E 가 ReadSharedMemory ,
WriteSharedMemory ,
또는 ReadModifyWriteSharedMemory
이벤트이면, E 를 events 에 추가한다.
events 를 반환한다.
29.5.3 HostEventSet ( execution )
추상 연산 HostEventSet은 인수 execution (후보 실행 )을 받아 이벤트 집합을 반환한다.
호출 시 다음 절차를 수행한다:
events 를 빈 집합으로 한다.
EventSet (execution )의 각 이벤트
E 에 대해
E 가 SharedDataBlockEventSet (execution )에
포함되어 있지 않으면, E 를 events 에 추가한다.
events 를 반환한다.
29.5.4 ComposeWriteEventBytes ( execution ,
byteIndex , Ws )
추상 연산 ComposeWriteEventBytes는 인수 execution (후보 실행 ),
byteIndex (음이 아닌 정수 ), Ws (WriteSharedMemory 또는
ReadModifyWriteSharedMemory 이벤트 리스트 )
를 받아 바이트 값 리스트 를 반환한다. 호출 시 다음
절차를 수행한다:
byteLocation 을 byteIndex 로 한다.
bytesRead 를 새 빈 리스트 로 한다.
Ws 의 각 요소 W 에 대해,
Assert : W 가 자신의 range에
byteLocation 을 포함함.
payloadIndex 를 byteLocation - W .[[ByteIndex]] 로 한다.
W 가 WriteSharedMemory
이벤트라면,
byte 를 W .[[Payload]] [payloadIndex ]로 한다.
그렇지 않다면,
Assert : W 는 ReadModifyWriteSharedMemory
이벤트임.
bytes 를 ValueOfReadEvent (execution ,
W )로 한다.
bytesModified 를 W .[[ModifyOp]] (bytes , W .[[Payload]] )로 한다.
byte 를
bytesModified [payloadIndex ]로 한다.
byte 를 bytesRead 에 추가한다.
byteLocation 을 byteLocation + 1로 한다.
bytesRead 를 반환한다.
참고 1
읽기-수정-쓰기 수정 [[ModifyOp]] 는 ReadModifyWriteSharedMemory
이벤트를 도입하는 Atomics 객체의 함수 속성에 의해 제공된다.
참고 2
이 추상 연산은 여러 쓰기 이벤트를 리스트 로 조합하여
바이트 값 리스트 로 만든다. 이는
ReadSharedMemory 및
ReadModifyWriteSharedMemory
이벤트의 이벤트 의미론에서 사용된다.
29.5.5 ValueOfReadEvent ( execution , R )
추상 연산 ValueOfReadEvent는 인수 execution (후보 실행 ), R
(ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트)
를 받아 바이트 값 리스트 를 반환한다. 호출 시 다음
절차를 수행한다:
Ws 를 reads-bytes-from (R ) in
execution 로 한다.
Assert :
Ws 는 R .[[ElementSize]] 와 길이가 같은 WriteSharedMemory 또는
ReadModifyWriteSharedMemory 이벤트 리스트 임.
ComposeWriteEventBytes (execution ,
R .[[ByteIndex]] , Ws )를 반환한다.
29.6 후보 실행의 관계
다음 관계와 수학적 함수들은 특정 후보 실행 을 매개변수로 하며, 해당 이벤트들을 순서화한다.
29.6.1 is-agent-order-before
후보
실행
execution 에 대해, is-agent-order-before 관계 는 다음을 만족하는 이벤트들에 대한
최소
관계 이다.
이벤트 E 와 D 에 대해, execution 에서 E
is-agent-order-before D 가 성립하려면, execution .[[EventsRecords]] 에 어떤 에이전트 이벤트 레코드
aer 가 존재하고, aer .[[EventList]] 에 E 와
D 가 모두 포함되어 있으며 E 가 aer .[[EventList]] 의 리스트 순서에서 D
앞에 있을 때 성립한다.
참고
각 에이전트 는 평가 중에
에이전트별 에이전트
엄격 전체 순서(strict total
order) 로 이벤트를 도입한다. 이는 그러한 엄격 전체 순서 의 합집합이다.
29.6.2 reads-bytes-from
후보
실행
execution 에 대해, reads-bytes-from 함수는 SharedDataBlockEventSet (execution )의
이벤트를 리스트 형태의 SharedDataBlockEventSet (execution )의
이벤트로 매핑하는 수학적 함수이며, 다음 조건을 만족한다.
후보
실행 은 항상 reads-bytes-from 함수를 허용한다.
29.6.3 reads-from
후보
실행
execution 에 대해, reads-from 관계 는 다음을 만족하는 이벤트들에 대한
최소
관계 이다.
29.6.4 host-synchronizes-with
후보
실행
execution 에 대해, host-synchronizes-with 관계 는 호스트 가 제공하는 엄격 부분 순서(strict partial
order) 이며,
호스트 특화 이벤트에 대해 최소한 다음을
만족한다.
참고 1
호스트 특화 이벤트
E 와 D 가 후보 실행
execution 에 있을 때, execution 에서 E host-synchronizes-with
D 라면, E 가 happens-before D 임을 의미한다.
참고 2
이 관계 는 호스트 가 HTML 워커 간
postMessage와 같은 추가 동기화 메커니즘을 제공할 수 있게 한다.
29.6.5 synchronizes-with
후보
실행
execution 에 대해, synchronizes-with 관계 는 다음을 만족하는 이벤트들에 대한
최소
관계 이다.
이벤트 R 와 W 에 대해, execution 에서 W synchronizes-with
R 가 성립하려면, R 가 reads-from W 이며, R .[[Order]] 및 W .[[Order]] 가 모두
seq-cst 이고, R 과 W 의 range가 동일해야 한다.
execution .[[EventsRecords]] 의 각 요소
eventsRecord 에 대해, 아래가 성립한다.
이벤트 S 와 Sw 에 대해, execution 에서 S
synchronizes-with Sw 가 성립하려면 eventsRecord .[[AgentSynchronizesWith]] 에 (S , Sw )가
포함되어 있어야 한다.
이벤트 E 와 D 에 대해, execution 에서 E synchronizes-with
D 가 성립하려면, execution .[[HostSynchronizesWith]] 에
(E , D )가 포함되어 있어야 한다.
참고 1
메모리
모델 문헌의 관례에 따라, 후보 실행
execution 에서 write 이벤트가 read 이벤트와 synchronizes-with 관계를 맺지, 반대로 하지 않는다.
참고 2
후보 실행
execution 에서 init 이벤트는 이 관계 에 참여하지 않고, 대신
happens-before 에 의해 직접 제약된다.
참고 3
후보 실행
execution 에서 seq-cst 이벤트가 reads-from 으로 연결되어 있다고 모두
synchronizes-with로 연결되는 것은 아니다. range가 동일한 이벤트만 synchronizes-with로 연결된다.
참고 4
공유 데이터 블록 이벤트
R 와 W 가 후보 실행
execution 에 있고, W 가 R 와 synchronizes-with 관계라면,
R 은 W 이외의 다른 write를 reads-from 할 수도 있다.
29.6.6 happens-before
후보
실행
execution 에 대해, happens-before 관계 는 다음을 만족하는 이벤트들에 대한
최소
관계 이다.
참고
happens-before는 에이전트 -order의 상위 집합이므로, 후보 실행 은 ECMAScript의 단일 스레드 평가
의미론과 일치한다.
29.7 유효 실행의 속성
29.7.1 유효하게 선택된 읽기
후보
실행 execution 이 유효하게 선택된 읽기를 가지려면 아래 알고리즘이
true 를 반환해야 한다.
ReadSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트 R 가 SharedDataBlockEventSet (execution )에
있을 때, 아래를 수행한다:
chosenValueRecord 를 execution .[[ChosenValues]] 에서 [[Event]]
필드가 R 인 요소로 한다.
chosenValue 를 chosenValueRecord .[[ChosenValue]] 로 한다.
readValue 를 ValueOfReadEvent (execution ,
R )로 한다.
chosenLen 을 chosenValue 의 요소 개수로 한다.
readLen 을 readValue 의 요소 개수로 한다.
chosenLen ≠ readLen 이면,
false 를 반환한다.
0(포함)부터 chosenLen (불포함)까지의 정수 i 중 어떤
i 에 대해 chosenValue [i ] ≠
readValue [i ]이면,
false 를 반환한다.
true 를 반환한다.
29.7.2 일관된(coherent) 읽기
후보
실행 execution 이 일관된 읽기를 가지려면 아래 알고리즘이 true 를
반환해야 한다.
ReadSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트 R 가 SharedDataBlockEventSet (execution )에
있을 때, 아래를 수행한다:
Ws 를 reads-bytes-from (R )
in execution 으로 한다.
byteLocation 을 R .[[ByteIndex]] 로
한다.
Ws 의 각 요소 W 에 대해,
execution 에서 R happens-before
W 이면,
false 를 반환한다.
byteLocation 을 자신의 range에 포함하는 WriteSharedMemory
또는 ReadModifyWriteSharedMemory
이벤트 V 가 존재하며 execution 에서 W happens-before
V 이고 V happens-before
R 이면,
false 를 반환한다.
byteLocation 을 byteLocation + 1로 한다.
true 를 반환한다.
29.7.3 찢김 없는(tear free) 읽기
후보
실행 execution 이 찢김 없는 읽기를 가지려면 아래 알고리즘이 true 를
반환해야 한다.
ReadSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트 R 가 SharedDataBlockEventSet (execution )에
있을 때, 아래를 수행한다:
R .[[NoTear]] 가 true 라면,
Assert : R .[[ByteIndex]] 를 R .[[ElementSize]] 로 나눈 나머지가 0이어야 한다.
execution 에서 R reads-from
W 이고 W .[[NoTear]] 가
true 인 모든 이벤트 W 에 대해,
R 과 W 의 range가 같고, 동일한 range를 가지는 Shared Data Block
event V 가 존재하며
V .[[NoTear]] 가
true 이고, W 와 V 가 동일 이벤트가
아니며, execution 에서 R reads-from
V 이면,
false 를 반환한다.
true 를 반환한다.
참고
이벤트의 [[NoTear]] 필드는 해당 이벤트가 정수형 TypedArray 에 접근해서 도입된 경우
true 이고, 부동소수점형 TypedArray 나 DataView로 도입된 경우
false 이다.
직관적으로 이 요구사항은, 정수형 TypedArray 를 통해 메모리 범위에 정렬된 방식으로
접근할 때, 해당 범위에 대한 단일 쓰기 이벤트가 다른 동일 범위의 쓰기 이벤트들과 데이터 경쟁 시 "승리"해야 한다는 뜻이다. 더 정확히는, 정렬된 읽기
이벤트가 동일한 범위의 여러 다른 쓰기 이벤트의 바이트를 조합하여 값을 읽을 수 없다는 뜻이다. 하지만, 정렬된 읽기 이벤트가 범위가 겹치는 여러 쓰기
이벤트로부터 읽는 것은 가능하다.
29.7.4 순차적으로 일관성 있는 아토믹 연산(Sequentially Consistent Atomics)
후보
실행
execution 에 대해, is-memory-order-before 는 엄격 전체 순서(strict total
order) 이며, EventSet (execution )의 모든 이벤트에 대해 다음을 만족해야
한다.
이벤트 E 와 D 에 대해, execution 에서 E
is-memory-order-before D 가 성립하려면, E happens-before D 여야 한다.
execution 에서 R reads-from W 인 이벤트 R ,
W 에 대해, WriteSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트 V 가 SharedDataBlockEventSet (execution )에
있고, V .[[Order]] 가 seq-cst 이며,
W 가 V 보다 memory-order 앞에 있고, V 가 R 보다
memory-order 앞에 있고, 아래 조건 중 하나라도 참이면 성립하지 않는다.
참고 1
이 절은 동일한 range의 seq-cst 이벤트들에 대해 추가 제약을 부여한다.
WriteSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트 W 가 SharedDataBlockEventSet (execution )에
있고, W .[[Order]] 가 seq-cst 라면,
동일한 range를 가지며 W 보다 memory-order 앞에 있는 ReadSharedMemory 또는
ReadModifyWriteSharedMemory
이벤트가 무한히 많을 수는 없다.
참고 2
이 절과 에이전트 의 전진성 보장(Forward Progress Guarantee)을
합하면, seq-cst 쓰기가 동일한 범위의 seq-cst
읽기에서 유한 시간 내에 관측됨을 보장한다.
후보
실행 이 순차적으로 일관성 있는 아토믹 연산을 가지려면 is-memory-order-before 관계 가 존재해야 한다.
참고 3
is-memory-order-before는 EventSet (execution )의 모든 이벤트를
포함하지만, happens-before 나 synchronizes-with 에 의해 제약받지 않는 이벤트들은
순서 내에서 아무 위치에나 올 수 있다.
29.7.5 유효한 실행
후보
실행 execution 이 유효한 실행(또는 간단히 실행)임을 만족하려면 아래 모든 조건을 만족해야 한다.
모든 프로그램은 적어도 하나의 유효한 실행을 가진다.
29.8 경쟁
실행 execution 과 SharedDataBlockEventSet (execution )에
포함된 이벤트 E 와 D 에 대해서, 아래 알고리즘이 true 를 반환하면 E 와
D 는 경쟁(race) 상태에 있다.
E 와 D 가 동일한 Shared Data Block
event 가 아니라면,
E happens-before D (실행
execution 기준) 및 D happens-before
E (실행 execution 기준)이 모두 참이 아닌 경우,
E 와 D 가 둘 다 WriteSharedMemory
또는 ReadModifyWriteSharedMemory
이벤트이고, E 와 D 의 range가 분리되어 있지 않다면,
true 를 반환한다.
E reads-from D (실행
execution 기준) 또는 D reads-from
E (실행 execution 기준)이라면,
true 를 반환한다.
false 를 반환한다.
29.9 데이터 경쟁
실행 execution 과 SharedDataBlockEventSet (execution )에
포함된 이벤트 E 와 D 에 대해서, 아래 알고리즘이 true 를 반환하면 E 와
D 는 데이터 경쟁(data race) 상태에 있다.
E 와 D 가 경쟁 상태(실행 execution 기준)라면,
E .[[Order]] 가 seq-cst 가
아니거나 D .[[Order]] 가
seq-cst 가 아니라면,
true 를 반환한다.
E 와 D 의 range가 겹친다면,
true 를 반환한다.
false 를 반환한다.
29.10 데이터 경쟁 없음
실행 execution 이 데이터 경쟁 없음(data race free) 이려면 SharedDataBlockEventSet (execution )에
포함된 두 이벤트가 데이터
경쟁 상태가 아니어야 한다.
모든 실행이 데이터 경쟁 없음이면 해당 프로그램은 데이터 경쟁 없음이다.
메모리 모델 은
데이터 경쟁이 없는 프로그램의 모든 이벤트에 대해 순차적 일관성을 보장한다.
29.11 공유 메모리 가이드라인
참고 1
아래는 ECMAScript 프로그래머가 공유 메모리를 사용할 때의 가이드라인이다.
프로그램을 데이터 경쟁 없음 상태로 유지하는 것을 추천한다. 즉, 동일한 메모리
위치에서 동시적인 비원자적 연산이 불가능하도록 한다. 데이터 경쟁 없음 프로그램은 각 에이전트 의 평가 의미론 단계가 서로
교차(interleaved)된다. 데이터 경쟁 없음 프로그램의 경우, 메모리
모델 의 세부사항을 알 필요가 없다. 세부사항을 이해하는 것이 ECMAScript를 더 잘 작성하는 데 직관을 제공하지
않는다.
더 일반적으로, 프로그램이 데이터 경쟁 없음 이 아니더라도, 원자적 연산이 데이터 경쟁에 연루되지
않고 경쟁하는 연산들이 모두 동일한 접근 크기를 갖는다면 예측 가능한 동작을 할 수 있다. 원자적 연산이 경쟁에 연루되지 않도록 하는 가장 쉬운 방법은 원자적과
비원자적 연산이 서로 다른 메모리 셀을 사용하도록 하거나, 서로 다른 크기의 원자적 접근이 동시에 같은 셀에 접근하지 않게 하는 것이다. 효과적으로 프로그램은 공유
메모리를 최대한 강타입(strongly typed)으로 취급해야 한다. 비원자적 경쟁 접근의 순서와 타이밍에 의존할 수 없지만, 메모리를 강타입으로 다루면 경쟁
접근이 "찢기지(tear)" 않는다(값의 여러 비트가 섞이지 않는다).
참고 2
아래는 공유 메모리를 사용하는 프로그램에 대해 컴파일러 변환을 작성하는 ECMAScript 구현자에 대한 가이드라인이다.
단일 에이전트 환경에서 유효한 대부분의
프로그램 변환을 다중 에이전트
환경에서도 허용하는 것이 바람직하다. 이는 다중 에이전트 프로그램에서 각 에이전트 의 성능이 단일 에이전트 환경과 같도록 보장한다. 이러한 변환은 판단하기 어려운 경우가
많다. 아래에 메모리
모델 에 의해 암시되거나 그보다 강한 규칙을 일부 제시하지만, 모두를 망라하지는 않는다. 이 규칙들은 is-agent-order-before 관계 를 구성하는 이벤트 도입 이전의
프로그램 변환에 적용된다.
에이전트 순서 슬라이스(agent-order slice) 란 단일
에이전트 에 대한 is-agent-order-before 관계 의 부분집합이다.
읽기 이벤트의 가능한 읽기 값(possible read values) 은 해당 이벤트에 대해 모든 유효 실행에 걸친
ValueOfReadEvent 의 값 집합이다.
공유 메모리가 없는 경우에 유효한 에이전트 순서 슬라이스의 변환은 공유 메모리 환경에서도 다음 예외를 제외하고 유효하다.
아토믹은 변경 불가(Atomics are carved in stone) : 프로그램 변환은 에이전트 순서 슬라이스의
seq-cst 이벤트가 unordered 연산과 재배열되거나,
seq-cst 연산끼리 재배열되거나, seq-cst 연산이
is-agent-order-before 관계 에서 제거되는 것을
초래해서는 안 된다.
(실제로 재배열 금지는 컴파일러가 모든 seq-cst 연산을 동기화로 간주하고, 최종 is-memory-order-before 관계 에 포함되도록
강제한다. 이는 인터-에이전트 프로그램 분석이 없는 경우에도 일반적으로 가정하는 사항이다. 또한,
컴파일러는 호출 대상의 memory-order 효과를 알 수 없는 모든 호출을 seq-cst 연산을 포함하는
것으로 간주해야 한다.)
읽기는 안정적이어야 한다(Reads must be stable) : 단일 공유 메모리 읽기는 실행 내에서 하나의 값만 관측해야 한다.
(예를 들어, 프로그램에서 의미적으로 단일 읽기가 여러 번 실행된다면, 이후에는 읽은 값 중 하나만 관측해야 한다. rematerialization이라
불리는 변환은 이 규칙을 위반할 수 있다.)
쓰기는 안정적이어야 한다(Writes must be stable) : 공유 메모리에 대한 모든 관측 가능한 쓰기는 실행의 프로그램 의미론을
따라야 한다.
(예를 들어, 변환이 관측 가능한 쓰기를 도입해서는 안 된다. 예를 들어 더 큰 위치에서 읽기-수정-쓰기 연산을 사용해 더 작은 데이터를 쓰거나,
프로그램이 쓸 수 없는 값을 메모리에 쓰거나, 읽은 값을 다시 해당 위치에 쓰는 경우 등. 만약 해당 위치가 읽기 이후 다른 에이전트 에 의해 덮어쓸 수 있다면
해당 변환은 허용되지 않는다.)
가능한 읽기 값은 비어 있지 않아야 한다(Possible read values must be non-empty) : 프로그램 변환은 공유
메모리 읽기의 가능한 읽기 값을 비워서는 안 된다.
(직관에 반하지만, 이 규칙은 사실 쓰기 변환을 제한한다. 쓰기는 메모리 모델 내에서 읽기 이벤트에 의해
읽힐 수 있도록 힘을 가진다. 예를 들어, 쓰기를 이동시키거나 합치거나 때로는 두 seq-cst 연산 사이에
재배열할 수 있지만, 위치를 업데이트하는 모든 쓰기를 제거해서는 안 된다. 최소한 하나의 쓰기는 남겨야 한다.)
유효한 변환 예시: 동일 위치에 대한 여러 비원자적 읽기 합치기, 비원자적 읽기 재배열, 추측적 비원자적 읽기 도입, 동일 위치에 대한 여러 비원자적 쓰기 합치기,
서로 다른 위치에 대한 비원자적 쓰기 재배열, 반복문 밖으로 비원자적 읽기 올리기(종료 조건에 영향이 있더라도). 일반적으로 aliased TypedArrays 는 위치가
서로 다름을 증명하기 어렵게 만든다.
참고 3
아래는 공유 메모리 접근에 대해 머신 코드를 생성하는 ECMAScript 구현자에 대한 가이드라인이다.
ARM이나 Power보다 약하지 않은 메모리 모델을 가진 아키텍처에서는, 비원자적 저장 및 로드는 타겟 아키텍처에서 단순 저장 및 로드로 컴파일될 수 있다. 원자적
저장 및 로드는 순차적 일관성을 보장하는 명령어로 컴파일될 수 있다. 그러한 명령어가 없다면, 메모리 배리어를 사용해야 하며, 저장 또는 로드 양쪽에 배리어를 둔다.
읽기-수정-쓰기 연산은 타겟 아키텍처의 읽기-수정-쓰기 명령어로 컴파일될 수 있다. 예를 들어 x86의 LOCK 프리픽스 명령어, ARM의
load-exclusive/store-exclusive, Power의 load-link/store-conditional 등이 있다.
특히, 메모리
모델 은 다음과 같은 코드 생성을 허용한다.
프로그램의 모든 원자적 연산은 반드시 필요하다고 간주한다.
원자적 연산은 서로 또는 비원자적 연산과 재배열되지 않는다.
함수는 항상 원자적 연산을 수행한다고 가정한다.
원자적 연산은 더 큰 데이터에 대한 읽기-수정-쓰기 연산으로 구현되지 않고, 적절한 크기의 원자적 연산이 없는 플랫폼에서는 lock-free가 아닌 원자적으로
구현된다. (모든 플랫폼은 모든 관련 크기의 정상적 메모리 접근 연산을 반드시 제공한다고 이미 가정함.)
단순 코드 생성 패턴은 다음과 같다:
일반적인 로드와 스토어는 단일 로드, 스토어 명령어로 컴파일된다.
락-프리(lock-free) 원자적 로드와 스토어는 전체(순차적으로 일관성 있는) 펜스, 일반 로드 또는 스토어, 전체 펜스로 컴파일된다.
락-프리 원자적 읽기-수정-쓰기 접근은 전체 펜스, 원자적 읽기-수정-쓰기 명령어 시퀀스, 전체 펜스로 컴파일된다.
락-프리 아닌 원자적 연산은 스핀락 획득, 전체 펜스, 일련의 비원자적 로드와 스토어 명령어, 전체 펜스, 스핀락 해제로 컴파일된다.
이 매핑은 주소 범위에 대한 원자적 연산이 비원자적 쓰기나 크기가 다른 원자적 연산과 경쟁하지 않는 한 올바르다. 실제로 이것만 필요하다. 메모리
모델 은 경쟁에 연루된 원자적 연산을 사실상 비원자적으로 취급한다. 반면 단순 매핑은 매우 강력하다. 원자적 연산이 순차적으로
일관성 있는 펜스로 사용되는 것을 허용하는데, 메모리 모델 은 실제로 이를 보장하지 않는다.
기본 패턴에 대한 로컬 개선도 메모리 모델 의 제약 내에서 허용된다. 예를 들어:
플랫폼 의존적인 개선으로 불필요한 펜스를 제거할 수 있다. 예를 들어 x86에서는 락-프리 원자적 로드와 스토어 주변의 펜스는 스토어 뒤 펜스 이외에는 항상
생략 가능하며, 락-프리 원자적 읽기-수정-쓰기 명령에는 펜스가 필요 없다. 이들은 모두 LOCK 프리픽스 명령을 사용하기 때문이다.
많은 플랫폼에는 여러 강도의 펜스가 있고, 순차적 일관성을 해치지 않는 한 약한 펜스를 특정 상황에서 사용할 수 있다.
대부분의 현대 플랫폼은 ECMAScript 아토믹이 요구하는 모든 데이터 크기에 대해 락-프리 아토믹을 지원한다. 락-프리 아닌 아토믹이 필요하다면, 아토믹
연산 본문 주변의 펜스는 보통 락/언락 단계에 합칠 수 있다. 락-프리 아닌 아토믹의 가장 간단한 방법은 SharedArrayBuffer마다 하나의 락 워드를
두는 것이다.
더 복잡한 플랫폼 의존적 개선도 있는데, 코드 분석이 필요하다. 예를 들어 두 개의 연속된 펜스는 한 번의 펜스와 같은 효과를 가지므로, 두 원자적 연산을
연이어 코드로 생성한다면 펜스를 한 번만 넣으면 된다. x86에서는 원자적 스토어 사이의 펜스도 생략 가능하다. 스토어 뒤 펜스는 이후의 로드와 분리할 때만
필요하다.
부록 A (설명용) 문법 요약
A.1 어휘 문법
SourceCharacter ::
any Unicode code point
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence
::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/*
MultiLineCommentChars opt
*/
MultiLineCommentChars
::
MultiLineNotAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
PostAsteriskCommentChars
::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
MultiLineNotAsteriskChar
::
SourceCharacter but not
*
MultiLineNotForwardSlashOrAsteriskChar
::
SourceCharacter but not one of
/ or *
SingleLineComment ::
//
SingleLineCommentChars opt
SingleLineCommentChars
::
SingleLineCommentChar
SingleLineCommentChars opt
SingleLineCommentChar
::
SourceCharacter but not
LineTerminator
HashbangComment ::
#!
SingleLineCommentChars opt
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar ::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter :: one
of a b c d
e f g h i
j k l m n
o p q r s
t u v w x
y z A B C
D E F G H
I J K L M
N O P Q R
S T U V W
X Y Z
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
ReservedWord :: one
of await break case
catch class const continue
debugger default delete do
else enum export extends
false finally for function
if import in instanceof
new null return super
switch this throw true
try typeof var void
while with yield
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator ::
one of { ( )
[ ] . ... ;
, < > <=
>= == != === !==
+ - * % **
++ -- << >>
>>> & | ^
! ~ && || ??
? : = += -=
*= %= **= <<=
>>= >>>= &= |=
^= &&= ||= ??=
=>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteralSeparator
::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep]
::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix ::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral
::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep]
::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit :: one
of 0 1 2 3
4 5 6 7 8
9
NonZeroDigit :: one
of 1 2 3 4
5 6 7 8 9
ExponentPart [Sep]
::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator ::
one of e E
SignedInteger [Sep]
::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep]
::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep]
::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit :: one
of 0 1
OctalIntegerLiteral [Sep]
::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep]
::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit :: one
of 0 1 2 3
4 5 6 7
NonOctalDigit ::
one of 8 9
HexIntegerLiteral [Sep]
::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep]
::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one
of 0 1 2 3
4 5 6 7 8
9 a b c d
e f A B C
D E F
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter
::
SourceCharacter but not one of
" or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter but not one of
' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
:: one of ' "
\ b f n r
t v
NonEscapeCharacter ::
SourceCharacter but not one of
EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence
::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit ::
OctalDigit but not
0
ZeroToThree :: one
of 0 1 2
3
FourToSeven :: one
of 4 5 6
7
NonOctalDecimalEscapeSequence
:: one of 8
9
HexEscapeSequence ::
x
HexDigit
HexDigit
UnicodeEscapeSequence
::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
RegularExpressionLiteral
::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
but not one of * or \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter but not
LineTerminator
RegularExpressionClass
::
[
RegularExpressionClassChars
]
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter ::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of
` or \ or $ or LineTerminator
TemplateEscapeSequence
::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence ::
0
DecimalDigit
DecimalDigit but not
0
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits >
0x10FFFF
CodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits ≤
0x10FFFF
A.2 표현식
IdentifierReference [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield,
Await] :
Identifier
yield
await
LabelIdentifier [Yield,
Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName but not ReservedWord
PrimaryExpression [Yield,
Await] :
this
IdentifierReference [?Yield,
?Await]
Literal
ArrayLiteral [?Yield,
?Await]
ObjectLiteral [?Yield,
?Await]
FunctionExpression
ClassExpression [?Yield,
?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield, ?Await,
~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield,
?Await]
)
(
...
BindingPattern [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingIdentifier [?Yield,
?Await]
)
(
Expression [+In, ?Yield,
?Await]
,
...
BindingPattern [?Yield,
?Await]
)
When processing an instance of the production
PrimaryExpression [Yield,
Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ParenthesizedExpression [Yield,
Await] :
(
Expression [+In, ?Yield,
?Await]
)
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral [Yield,
Await] :
[
Elision opt
]
[
ElementList [?Yield,
?Await]
]
[
ElementList [?Yield,
?Await]
,
Elision opt
]
ElementList [Yield,
Await] :
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
Elision opt
SpreadElement [?Yield,
?Await]
ElementList [?Yield,
?Await]
,
Elision opt
AssignmentExpression [+In,
?Yield, ?Await]
ElementList [?Yield,
?Await]
,
Elision opt
SpreadElement [?Yield,
?Await]
Elision :
,
Elision
,
SpreadElement [Yield,
Await] :
...
AssignmentExpression [+In,
?Yield, ?Await]
ObjectLiteral [Yield,
Await] :
{
}
{
PropertyDefinitionList [?Yield,
?Await]
}
{
PropertyDefinitionList [?Yield,
?Await]
,
}
PropertyDefinitionList [Yield,
Await] :
PropertyDefinition [?Yield,
?Await]
PropertyDefinitionList [?Yield,
?Await]
,
PropertyDefinition [?Yield,
?Await]
PropertyDefinition [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
CoverInitializedName [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
AssignmentExpression [+In,
?Yield, ?Await]
MethodDefinition [?Yield,
?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
PropertyName [Yield,
Await] :
LiteralPropertyName
ComputedPropertyName [?Yield,
?Await]
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName [Yield,
Await] :
[
AssignmentExpression [+In,
?Yield, ?Await]
]
CoverInitializedName [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await]
Initializer [In, Yield,
Await] :
=
AssignmentExpression [?In,
?Yield, ?Await]
TemplateLiteral [Yield, Await,
Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield,
?Await, ?Tagged]
SubstitutionTemplate [Yield,
Await, Tagged] :
TemplateHead
Expression [+In, ?Yield,
?Await]
TemplateSpans [?Yield, ?Await,
?Tagged]
TemplateSpans [Yield, Await,
Tagged] :
TemplateTail
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateTail
TemplateMiddleList [Yield, Await,
Tagged] :
TemplateMiddle
Expression [+In, ?Yield,
?Await]
TemplateMiddleList [?Yield,
?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield,
?Await]
MemberExpression [Yield,
Await] :
PrimaryExpression [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
MemberExpression [?Yield,
?Await]
.
IdentifierName
MemberExpression [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
SuperProperty [?Yield,
?Await]
MetaProperty
new
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
MemberExpression [?Yield,
?Await]
.
PrivateIdentifier
SuperProperty [Yield,
Await] :
super
[
Expression [+In, ?Yield,
?Await]
]
super
.
IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new
.
target
ImportMeta :
import
.
meta
NewExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
new
NewExpression [?Yield,
?Await]
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
SuperCall [?Yield,
?Await]
ImportCall [?Yield,
?Await]
CallExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
CallExpression [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
CallExpression [?Yield,
?Await]
.
IdentifierName
CallExpression [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
CallExpression [?Yield,
?Await]
.
PrivateIdentifier
When processing an instance of the production
CallExpression [Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
the interpretation of CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
CallMemberExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
SuperCall [Yield,
Await] :
super
Arguments [?Yield,
?Await]
ImportCall [Yield,
Await] :
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
import
(
AssignmentExpression [+In,
?Yield, ?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
,opt
)
Arguments [Yield,
Await] :
(
)
(
ArgumentList [?Yield,
?Await]
)
(
ArgumentList [?Yield,
?Await]
,
)
ArgumentList [Yield,
Await] :
AssignmentExpression [+In,
?Yield, ?Await]
...
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
AssignmentExpression [+In,
?Yield, ?Await]
ArgumentList [?Yield,
?Await]
,
...
AssignmentExpression [+In,
?Yield, ?Await]
OptionalExpression [Yield,
Await] :
MemberExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
OptionalChain [Yield,
Await] :
?.
Arguments [?Yield,
?Await]
?.
[
Expression [+In, ?Yield,
?Await]
]
?.
IdentifierName
?.
TemplateLiteral [?Yield, ?Await,
+Tagged]
?.
PrivateIdentifier
OptionalChain [?Yield,
?Await]
Arguments [?Yield,
?Await]
OptionalChain [?Yield,
?Await]
[
Expression [+In, ?Yield,
?Await]
]
OptionalChain [?Yield,
?Await]
.
IdentifierName
OptionalChain [?Yield,
?Await]
TemplateLiteral [?Yield, ?Await,
+Tagged]
OptionalChain [?Yield,
?Await]
.
PrivateIdentifier
LeftHandSideExpression [Yield,
Await] :
NewExpression [?Yield,
?Await]
CallExpression [?Yield,
?Await]
OptionalExpression [?Yield,
?Await]
UpdateExpression [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
++
LeftHandSideExpression [?Yield,
?Await]
[no LineTerminator
here]
--
++
UnaryExpression [?Yield,
?Await]
--
UnaryExpression [?Yield,
?Await]
UnaryExpression [Yield,
Await] :
UpdateExpression [?Yield,
?Await]
delete
UnaryExpression [?Yield,
?Await]
void
UnaryExpression [?Yield,
?Await]
typeof
UnaryExpression [?Yield,
?Await]
+
UnaryExpression [?Yield,
?Await]
-
UnaryExpression [?Yield,
?Await]
~
UnaryExpression [?Yield,
?Await]
!
UnaryExpression [?Yield,
?Await]
[+Await]
AwaitExpression [?Yield]
ExponentiationExpression [Yield,
Await] :
UnaryExpression [?Yield,
?Await]
UpdateExpression [?Yield,
?Await]
**
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [Yield,
Await] :
ExponentiationExpression [?Yield,
?Await]
MultiplicativeExpression [?Yield,
?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield,
?Await]
MultiplicativeOperator
: one of * /
%
AdditiveExpression [Yield,
Await] :
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
+
MultiplicativeExpression [?Yield,
?Await]
AdditiveExpression [?Yield,
?Await]
-
MultiplicativeExpression [?Yield,
?Await]
ShiftExpression [Yield,
Await] :
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
<<
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>
AdditiveExpression [?Yield,
?Await]
ShiftExpression [?Yield,
?Await]
>>>
AdditiveExpression [?Yield,
?Await]
RelationalExpression [In, Yield,
Await] :
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
<=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
>=
ShiftExpression [?Yield,
?Await]
RelationalExpression [?In,
?Yield, ?Await]
instanceof
ShiftExpression [?Yield,
?Await]
[+In]
RelationalExpression [+In,
?Yield, ?Await]
in
ShiftExpression [?Yield,
?Await]
[+In]
PrivateIdentifier
in
ShiftExpression [?Yield,
?Await]
EqualityExpression [In, Yield,
Await] :
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
==
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!=
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
===
RelationalExpression [?In,
?Yield, ?Await]
EqualityExpression [?In,
?Yield, ?Await]
!==
RelationalExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [In, Yield,
Await] :
EqualityExpression [?In,
?Yield, ?Await]
BitwiseANDExpression [?In,
?Yield, ?Await]
&
EqualityExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [In, Yield,
Await] :
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseXORExpression [?In,
?Yield, ?Await]
^
BitwiseANDExpression [?In,
?Yield, ?Await]
BitwiseORExpression [In, Yield,
Await] :
BitwiseXORExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
|
BitwiseXORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [In, Yield,
Await] :
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalANDExpression [?In,
?Yield, ?Await]
&&
BitwiseORExpression [?In,
?Yield, ?Await]
LogicalORExpression [In, Yield,
Await] :
LogicalANDExpression [?In,
?Yield, ?Await]
LogicalORExpression [?In,
?Yield, ?Await]
||
LogicalANDExpression [?In,
?Yield, ?Await]
CoalesceExpression [In, Yield,
Await] :
CoalesceExpressionHead [?In,
?Yield, ?Await]
??
BitwiseORExpression [?In,
?Yield, ?Await]
CoalesceExpressionHead [In,
Yield, Await] :
CoalesceExpression [?In,
?Yield, ?Await]
BitwiseORExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [In,
Yield, Await] :
LogicalORExpression [?In,
?Yield, ?Await]
CoalesceExpression [?In,
?Yield, ?Await]
ConditionalExpression [In,
Yield, Await] :
ShortCircuitExpression [?In,
?Yield, ?Await]
ShortCircuitExpression [?In,
?Yield, ?Await]
?
AssignmentExpression [+In,
?Yield, ?Await]
:
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentExpression [In, Yield,
Await] :
ConditionalExpression [?In,
?Yield, ?Await]
[+Yield]
YieldExpression [?In,
?Await]
ArrowFunction [?In, ?Yield,
?Await]
AsyncArrowFunction [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
AssignmentOperator
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
&&=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
||=
AssignmentExpression [?In,
?Yield, ?Await]
LeftHandSideExpression [?Yield,
?Await]
??=
AssignmentExpression [?In,
?Yield, ?Await]
AssignmentOperator :
one of *= /= %=
+= -= <<= >>=
>>>= &= ^= |=
**=
In certain circumstances when processing an instance of the production
AssignmentExpression [In,
Yield, Await] :
LeftHandSideExpression [?Yield,
?Await]
=
AssignmentExpression [?In,
?Yield, ?Await]
the interpretation of LeftHandSideExpression is refined using the
following grammar:
AssignmentPattern [Yield,
Await] :
ObjectAssignmentPattern [?Yield,
?Await]
ArrayAssignmentPattern [?Yield,
?Await]
ObjectAssignmentPattern [Yield,
Await] :
{
}
{
AssignmentRestProperty [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
}
{
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentRestProperty [?Yield,
?Await] opt
}
ArrayAssignmentPattern [Yield,
Await] :
[
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
[
AssignmentElementList [?Yield,
?Await]
]
[
AssignmentElementList [?Yield,
?Await]
,
Elision opt
AssignmentRestElement [?Yield,
?Await] opt
]
AssignmentRestProperty [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
AssignmentPropertyList [Yield,
Await] :
AssignmentProperty [?Yield,
?Await]
AssignmentPropertyList [?Yield,
?Await]
,
AssignmentProperty [?Yield,
?Await]
AssignmentElementList [Yield,
Await] :
AssignmentElisionElement [?Yield,
?Await]
AssignmentElementList [?Yield,
?Await]
,
AssignmentElisionElement [?Yield,
?Await]
AssignmentElisionElement [Yield,
Await] :
Elision opt
AssignmentElement [?Yield,
?Await]
AssignmentProperty [Yield,
Await] :
IdentifierReference [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
PropertyName [?Yield,
?Await]
:
AssignmentElement [?Yield,
?Await]
AssignmentElement [Yield,
Await] :
DestructuringAssignmentTarget [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
AssignmentRestElement [Yield,
Await] :
...
DestructuringAssignmentTarget [?Yield,
?Await]
DestructuringAssignmentTarget [Yield,
Await] :
LeftHandSideExpression [?Yield,
?Await]
Expression [In, Yield,
Await] :
AssignmentExpression [?In,
?Yield, ?Await]
Expression [?In, ?Yield,
?Await]
,
AssignmentExpression [?In,
?Yield, ?Await]
A.3 문장
Statement [Yield, Await,
Return] :
BlockStatement [?Yield, ?Await,
?Return]
VariableStatement [?Yield,
?Await]
EmptyStatement
ExpressionStatement [?Yield,
?Await]
IfStatement [?Yield, ?Await,
?Return]
BreakableStatement [?Yield,
?Await, ?Return]
ContinueStatement [?Yield,
?Await]
BreakStatement [?Yield,
?Await]
[+Return]
ReturnStatement [?Yield,
?Await]
WithStatement [?Yield, ?Await,
?Return]
LabelledStatement [?Yield,
?Await, ?Return]
ThrowStatement [?Yield,
?Await]
TryStatement [?Yield, ?Await,
?Return]
DebuggerStatement
Declaration [Yield,
Await] :
HoistableDeclaration [?Yield,
?Await, ~Default]
ClassDeclaration [?Yield, ?Await,
~Default]
LexicalDeclaration [+In,
?Yield, ?Await]
HoistableDeclaration [Yield,
Await, Default] :
FunctionDeclaration [?Yield,
?Await, ?Default]
GeneratorDeclaration [?Yield,
?Await, ?Default]
AsyncFunctionDeclaration [?Yield,
?Await, ?Default]
AsyncGeneratorDeclaration [?Yield,
?Await, ?Default]
BreakableStatement [Yield, Await,
Return] :
IterationStatement [?Yield,
?Await, ?Return]
SwitchStatement [?Yield, ?Await,
?Return]
BlockStatement [Yield, Await,
Return] :
Block [?Yield, ?Await,
?Return]
Block [Yield,
Await, Return] :
{
StatementList [?Yield, ?Await,
?Return] opt
}
StatementList [Yield, Await,
Return] :
StatementListItem [?Yield,
?Await, ?Return]
StatementList [?Yield, ?Await,
?Return]
StatementListItem [?Yield,
?Await, ?Return]
StatementListItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
Declaration [?Yield,
?Await]
LexicalDeclaration [In, Yield,
Await] :
LetOrConst
BindingList [?In, ?Yield,
?Await]
;
LetOrConst :
let
const
BindingList [In, Yield,
Await] :
LexicalBinding [?In, ?Yield,
?Await]
BindingList [?In, ?Yield,
?Await]
,
LexicalBinding [?In, ?Yield,
?Await]
LexicalBinding [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
VariableStatement [Yield,
Await] :
var
VariableDeclarationList [+In,
?Yield, ?Await]
;
VariableDeclarationList [In,
Yield, Await] :
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclarationList [?In,
?Yield, ?Await]
,
VariableDeclaration [?In,
?Yield, ?Await]
VariableDeclaration [In, Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await] opt
BindingPattern [?Yield,
?Await]
Initializer [?In, ?Yield,
?Await]
BindingPattern [Yield,
Await] :
ObjectBindingPattern [?Yield,
?Await]
ArrayBindingPattern [?Yield,
?Await]
ObjectBindingPattern [Yield,
Await] :
{
}
{
BindingRestProperty [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
}
{
BindingPropertyList [?Yield,
?Await]
,
BindingRestProperty [?Yield,
?Await] opt
}
ArrayBindingPattern [Yield,
Await] :
[
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
[
BindingElementList [?Yield,
?Await]
]
[
BindingElementList [?Yield,
?Await]
,
Elision opt
BindingRestElement [?Yield,
?Await] opt
]
BindingRestProperty [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
BindingPropertyList [Yield,
Await] :
BindingProperty [?Yield,
?Await]
BindingPropertyList [?Yield,
?Await]
,
BindingProperty [?Yield,
?Await]
BindingElementList [Yield,
Await] :
BindingElisionElement [?Yield,
?Await]
BindingElementList [?Yield,
?Await]
,
BindingElisionElement [?Yield,
?Await]
BindingElisionElement [Yield,
Await] :
Elision opt
BindingElement [?Yield,
?Await]
BindingProperty [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
PropertyName [?Yield,
?Await]
:
BindingElement [?Yield,
?Await]
BindingElement [Yield,
Await] :
SingleNameBinding [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
SingleNameBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
BindingRestElement [Yield,
Await] :
...
BindingIdentifier [?Yield,
?Await]
...
BindingPattern [?Yield,
?Await]
EmptyStatement :
;
ExpressionStatement [Yield,
Await] :
[lookahead ∉ { { , function , async
[no LineTerminator
here]
function , class , let
[ }]
Expression [+In, ?Yield,
?Await]
;
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
[lookahead ≠ else ]
IterationStatement [Yield, Await,
Return] :
DoWhileStatement [?Yield, ?Await,
?Return]
WhileStatement [?Yield, ?Await,
?Return]
ForStatement [?Yield, ?Await,
?Return]
ForInOfStatement [?Yield, ?Await,
?Return]
DoWhileStatement [Yield, Await,
Return] :
do
Statement [?Yield, ?Await,
?Return]
while
(
Expression [+In, ?Yield,
?Await]
)
;
WhileStatement [Yield, Await,
Return] :
while
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
ForStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
var
VariableDeclarationList [~In,
?Yield, ?Await]
;
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
for
(
LexicalDeclaration [~In,
?Yield, ?Await]
Expression [+In, ?Yield,
?Await] opt
;
Expression [+In, ?Yield,
?Await] opt
)
Statement [?Yield, ?Await,
?Return]
ForInOfStatement [Yield, Await,
Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
for
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
var
ForBinding [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
[+Await]
for
await
(
ForDeclaration [?Yield,
?Await]
of
AssignmentExpression [+In,
?Yield, ?Await]
)
Statement [?Yield, ?Await,
?Return]
ForDeclaration [Yield,
Await] :
LetOrConst
ForBinding [?Yield,
?Await]
ForBinding [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
ContinueStatement [Yield,
Await] :
continue
;
continue
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
BreakStatement [Yield,
Await] :
break
;
break
[no LineTerminator
here]
LabelIdentifier [?Yield,
?Await]
;
ReturnStatement [Yield,
Await] :
return
;
return
[no LineTerminator
here]
Expression [+In, ?Yield,
?Await]
;
WithStatement [Yield, Await,
Return] :
with
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
SwitchStatement [Yield, Await,
Return] :
switch
(
Expression [+In, ?Yield,
?Await]
)
CaseBlock [?Yield, ?Await,
?Return]
CaseBlock [Yield, Await,
Return] :
{
CaseClauses [?Yield, ?Await,
?Return] opt
}
{
CaseClauses [?Yield, ?Await,
?Return] opt
DefaultClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return] opt
}
CaseClauses [Yield, Await,
Return] :
CaseClause [?Yield, ?Await,
?Return]
CaseClauses [?Yield, ?Await,
?Return]
CaseClause [?Yield, ?Await,
?Return]
CaseClause [Yield, Await,
Return] :
case
Expression [+In, ?Yield,
?Await]
:
StatementList [?Yield, ?Await,
?Return] opt
DefaultClause [Yield, Await,
Return] :
default
:
StatementList [?Yield, ?Await,
?Return] opt
LabelledStatement [Yield, Await,
Return] :
LabelIdentifier [?Yield,
?Await]
:
LabelledItem [?Yield, ?Await,
?Return]
LabelledItem [Yield, Await,
Return] :
Statement [?Yield, ?Await,
?Return]
FunctionDeclaration [?Yield,
?Await, ~Default]
ThrowStatement [Yield,
Await] :
throw
[no LineTerminator
here]
Expression [+In, ?Yield,
?Await]
;
TryStatement [Yield, Await,
Return] :
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
try
Block [?Yield, ?Await,
?Return]
Catch [?Yield, ?Await,
?Return]
Finally [?Yield, ?Await,
?Return]
Catch [Yield,
Await, Return] :
catch
(
CatchParameter [?Yield,
?Await]
)
Block [?Yield, ?Await,
?Return]
catch
Block [?Yield, ?Await,
?Return]
Finally [Yield, Await,
Return] :
finally
Block [?Yield, ?Await,
?Return]
CatchParameter [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
BindingPattern [?Yield,
?Await]
DebuggerStatement :
debugger
;
A.4 함수와 클래스
UniqueFormalParameters [Yield,
Await] :
FormalParameters [?Yield,
?Await]
FormalParameters [Yield,
Await] :
[empty]
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameterList [?Yield,
?Await]
,
FunctionRestParameter [?Yield,
?Await]
FormalParameterList [Yield,
Await] :
FormalParameter [?Yield,
?Await]
FormalParameterList [?Yield,
?Await]
,
FormalParameter [?Yield,
?Await]
FunctionRestParameter [Yield,
Await] :
BindingRestElement [?Yield,
?Await]
FormalParameter [Yield,
Await] :
BindingElement [?Yield,
?Await]
FunctionDeclaration [Yield, Await,
Default] :
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
[+Default]
function
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield,
~Await] opt
(
FormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
FunctionBody [Yield,
Await] :
FunctionStatementList [?Yield,
?Await]
FunctionStatementList [Yield,
Await] :
StatementList [?Yield, ?Await,
+Return] opt
ArrowFunction [In, Yield,
Await] :
ArrowParameters [?Yield,
?Await]
[no LineTerminator
here]
=>
ConciseBody [?In]
ArrowParameters [Yield,
Await] :
BindingIdentifier [?Yield,
?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
ConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
~Await]
{
FunctionBody [~Yield,
~Await]
}
ExpressionBody [In,
Await] :
AssignmentExpression [?In,
~Yield, ?Await]
When processing an instance of the production
ArrowParameters [Yield,
Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield,
?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ArrowFormalParameters [Yield,
Await] :
(
UniqueFormalParameters [?Yield,
?Await]
)
AsyncArrowFunction [In, Yield,
Await] :
async
[no LineTerminator
here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In]
:
[lookahead ≠ { ]
ExpressionBody [?In,
+Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield]
:
BindingIdentifier [?Yield,
+Await]
CoverCallExpressionAndAsyncArrowHead [Yield,
Await] :
MemberExpression [?Yield,
?Await]
Arguments [?Yield,
?Await]
When processing an instance of the production
AsyncArrowFunction [In, Yield,
Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield,
?Await]
[no LineTerminator
here]
=>
AsyncConciseBody [?In]
the interpretation of CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
AsyncArrowHead :
async
[no LineTerminator
here]
ArrowFormalParameters [~Yield,
+Await]
MethodDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
~Await]
)
{
FunctionBody [~Yield,
~Await]
}
GeneratorMethod [?Yield,
?Await]
AsyncMethod [?Yield,
?Await]
AsyncGeneratorMethod [?Yield,
?Await]
get
ClassElementName [?Yield,
?Await]
(
)
{
FunctionBody [~Yield,
~Await]
}
set
ClassElementName [?Yield,
?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield,
~Await]
}
PropertySetParameterList
:
FormalParameter [~Yield,
~Await]
GeneratorDeclaration [Yield,
Await, Default] :
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier [+Yield,
~Await] opt
(
FormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield,
Await] :
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield,
~Await]
YieldExpression [In,
Await] :
yield
yield
[no LineTerminator
here]
AssignmentExpression [?In,
+Yield, ?Await]
yield
[no LineTerminator
here]
*
AssignmentExpression [?In,
+Yield, ?Await]
AsyncGeneratorDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
*
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator
here]
function
*
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression
:
async
[no LineTerminator
here]
function
*
BindingIdentifier [+Yield,
+Await] opt
(
FormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield,
Await] :
async
[no LineTerminator
here]
*
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [+Yield,
+Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield,
+Await]
AsyncFunctionDeclaration [Yield,
Await, Default] :
async
[no LineTerminator
here]
function
BindingIdentifier [?Yield,
?Await]
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator
here]
function
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression
:
async
[no LineTerminator
here]
function
BindingIdentifier [~Yield,
+Await] opt
(
FormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield,
Await] :
async
[no LineTerminator
here]
ClassElementName [?Yield,
?Await]
(
UniqueFormalParameters [~Yield,
+Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield,
+Await]
AwaitExpression [Yield]
:
await
UnaryExpression [?Yield,
+Await]
ClassDeclaration [Yield, Await,
Default] :
class
BindingIdentifier [?Yield,
?Await]
ClassTail [?Yield,
?Await]
[+Default]
class
ClassTail [?Yield,
?Await]
ClassExpression [Yield,
Await] :
class
BindingIdentifier [?Yield,
?Await] opt
ClassTail [?Yield,
?Await]
ClassTail [Yield,
Await] :
ClassHeritage [?Yield,
?Await] opt
{
ClassBody [?Yield,
?Await] opt
}
ClassHeritage [Yield,
Await] :
extends
LeftHandSideExpression [?Yield,
?Await]
ClassBody [Yield,
Await] :
ClassElementList [?Yield,
?Await]
ClassElementList [Yield,
Await] :
ClassElement [?Yield,
?Await]
ClassElementList [?Yield,
?Await]
ClassElement [?Yield,
?Await]
ClassElement [Yield,
Await] :
MethodDefinition [?Yield,
?Await]
static
MethodDefinition [?Yield,
?Await]
FieldDefinition [?Yield,
?Await]
;
static
FieldDefinition [?Yield,
?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield,
Await] :
ClassElementName [?Yield,
?Await]
Initializer [+In, ?Yield,
?Await] opt
ClassElementName [Yield,
Await] :
PropertyName [?Yield,
?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody :
ClassStaticBlockStatementList
ClassStaticBlockStatementList
:
StatementList [~Yield, +Await,
~Return] opt
A.5 스크립트와 모듈
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await,
~Return]
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield,
+Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding
:
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
ImportsList
,
}
FromClause :
from
ModuleSpecifier
ImportsList :
ImportSpecifier
ImportsList
,
ImportSpecifier
ImportSpecifier :
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier [~Yield,
+Await]
WithClause :
with
{
}
with
{
WithEntries
,opt
}
WithEntries :
AttributeKey
:
StringLiteral
AttributeKey
:
StringLiteral
,
WithEntries
AttributeKey :
IdentifierName
StringLiteral
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield,
+Await]
export
Declaration [~Yield,
+Await]
export
default
HoistableDeclaration [~Yield,
+Await, +Default]
export
default
ClassDeclaration [~Yield, +Await,
+Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator
here]
function , class }]
AssignmentExpression [+In,
~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
A.6 숫자 변환
StringNumericLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
All grammar symbols not explicitly defined by the StringNumericLiteral grammar have the
definitions used in the Lexical Grammar for numeric literals .
StringIntegerLiteral
:::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
A.7 시간대 오프셋 문자열 형식
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign ::: one
of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended]
:::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended]
::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
::: one of .
,
A.8 정규 표현식
Pattern [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
[empty]
Alternative [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
Assertion [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode,
NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode,
?NamedCaptureGroups]
CharacterClass [?UnicodeMode,
?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers
::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier
:: one of i m
s
SyntaxCharacter ::
one of ^ $ \
. * + ? (
) [ ] { }
|
PatternCharacter ::
SourceCharacter but not
SyntaxCharacter
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode]
::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape ::
one of f n r
t v
GroupSpecifier [UnicodeMode]
::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode]
::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode]
::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode]
::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode]
::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode]
:: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate ::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
Each \u HexTrailSurrogate for which the choice of
associated u HexLeadSurrogate is ambiguous shall be associated
with the nearest possible u HexLeadSurrogate that would otherwise have no
corresponding \u HexTrailSurrogate .
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in
the inclusive
interval from 0xD800 to 0xDBFF
HexTrailSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in
the inclusive
interval from 0xDC00 to 0xDFFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is
not in the inclusive
interval from 0xD800 to 0xDFFF
IdentityEscape [UnicodeMode]
:: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter but not
UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode]
::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression
::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
_
CharacterClass [UnicodeMode,
UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode,
?UnicodeSetsMode]
]
ClassContents [UnicodeMode,
UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode]
::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode,
~UnicodeSetsMode]
ClassAtom [UnicodeMode]
::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode]
::
SourceCharacter but not one of
\ or ] or -
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode]
::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression ::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection ::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode,
+UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
ClassStringDisjunction
::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents
::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not
ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator
:: one of &&
!! ## $$ %% **
++ ,, .. :: ;;
<< == >> ??
@@ ^^ `` ~~
ClassSetSyntaxCharacter
:: one of ( )
[ ] { } /
- \ |
ClassSetReservedPunctuator
:: one of & -
! # % , :
; < = > @
` ~
부록 B (규범적) 웹 브라우저를 위한 추가 ECMAScript 기능
이 부록에서 정의된 ECMAScript 언어의 문법과 의미론은 ECMAScript 호스트 가 웹 브라우저일 때 필수적이다. 이 부록의 내용은 규범적이지만 ECMAScript 호스트 가 웹 브라우저가 아닌 경우 선택적이다.
참고
이 부록에서는 다양한 레거시 기능과 웹 브라우저 ECMAScript 호스트 의 특성을 설명한다. 이 부록에 명시된 모든 언어 기능과 동작들은 하나 이상의 바람직하지 않은 특성을
가지며, 레거시 사용이 없다면 이 명세에서 제거될 것이다. 그러나 많은 기존 웹 페이지들이 이 기능들을 사용하기 때문에 웹 브라우저들은 계속 이를 지원해야 한다. 이 부록의
명세는 이러한 레거시 기능들의 상호운용 구현 요건을 정의한다.
이러한 기능들은 ECMAScript 언어의 핵심 부분으로 간주되지 않는다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작의 존재를 사용하거나
가정해서는 안 된다. ECMAScript 구현체는 웹 브라우저의 일부이거나 웹 브라우저가 접하는 동일한 레거시 ECMAScript 코드를 실행해야 하는 경우를 제외하고는 이
기능들의 구현을 지양해야 한다.
B.1 추가 문법
B.1.2 정규 표현식 패턴
22.2.1 의 문법은
다음과 같이 수정되고 확장된다. 이러한 변경으로 인해 모호성이 발생할 수 있으며, 이는 문법 생성 규칙의 순서와 문맥 정보에 의해 해결된다. 다음 문법을 사용하여 파싱할
때, 각 대안은 이전 생성 규칙의 대안이 일치하지 않을 경우에만 고려된다.
이 대체 패턴 문법과 의미론은 BMP 패턴의 문법과 의미론만 변경한다. 아래의 문법 확장에는 [UnicodeMode] 매개변수가 있는 생성식이 포함되어 있지만, 이러한 확장
중 어느 것도 목표 기호 에 [UnicodeMode] 매개변수가 존재할 때 인식되는
유니코드 패턴의 문법을 변경하지 않는다.
문법
Term [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
:: [+UnicodeMode]
Assertion [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
Quantifier
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode,
?NamedCaptureGroups]
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
Assertion [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Assertion [UnicodeMode,
UnicodeSetsMode, NamedCaptureGroups]
::
^
$
\b
\B
[+UnicodeMode]
(?=
Disjunction [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
[+UnicodeMode]
(?!
Disjunction [+UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
(?<=
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode,
?UnicodeSetsMode, ?NamedCaptureGroups]
)
QuantifiableAssertion [NamedCaptureGroups]
::
(?=
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
ExtendedAtom [NamedCaptureGroups]
::
.
\
AtomEscape [~UnicodeMode,
?NamedCaptureGroups]
\
[lookahead = c ]
CharacterClass [~UnicodeMode,
~UnicodeSetsMode]
(
GroupSpecifier [~UnicodeMode] opt
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [~UnicodeMode,
~UnicodeSetsMode, ?NamedCaptureGroups]
)
InvalidBracedQuantifier
ExtendedPatternCharacter
InvalidBracedQuantifier
::
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
ExtendedPatternCharacter
::
SourceCharacter
but not one of ^
$
\
.
*
+
?
(
)
[
|
AtomEscape [UnicodeMode,
NamedCaptureGroups] ::
[+UnicodeMode]
DecimalEscape
[~UnicodeMode]
DecimalEscape
but only if the CapturingGroupNumber
of DecimalEscape
is ≤ CountLeftCapturingParensWithin (the
Pattern containing
DecimalEscape )
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode,
?NamedCaptureGroups]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode,
NamedCaptureGroups] ::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
[~UnicodeMode]
LegacyOctalEscapeSequence
IdentityEscape [?UnicodeMode,
?NamedCaptureGroups]
IdentityEscape [UnicodeMode,
NamedCaptureGroups] ::
[+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacterIdentityEscape [?NamedCaptureGroups]
SourceCharacterIdentityEscape [NamedCaptureGroups]
:: [~NamedCaptureGroups]
SourceCharacter
but not c
[+NamedCaptureGroups]
SourceCharacter
but not one of c or k
ClassAtomNoDash [UnicodeMode,
NamedCaptureGroups] ::
SourceCharacter
but not one of \ or ] or
-
\
ClassEscape [?UnicodeMode,
?NamedCaptureGroups]
\
[lookahead = c ]
ClassEscape [UnicodeMode,
NamedCaptureGroups] ::
b
[+UnicodeMode]
-
[~UnicodeMode]
c
ClassControlLetter
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode,
?NamedCaptureGroups]
ClassControlLetter
::
DecimalDigit
_
참고
같은 좌변이 [+UnicodeMode]와 [~UnicodeMode] 가드를 모두 가지고 있을 때, 이는 모호성 우선순위를 제어하기 위한 것이다.
B.1.2.1 정적 의미론: 초기 에러
22.2.1.1 의 의미론은 아래와
같이 확장된다:
ExtendedAtom
:: InvalidBracedQuantifier
이 생성식에 의해 소스 텍스트가 일치하면 구문 오류(Syntax Error)이다.
추가적으로, 아래 생성식에 대한 규칙은 강조된 텍스트가 추가되어 수정된다:
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
B.1.2.2 정적 의미론: CountLeftCapturingParensWithin 및
CountLeftCapturingParensBefore
CountLeftCapturingParensWithin
및 CountLeftCapturingParensBefore 의
정의에서,
“
Atom ::
(
GroupSpecifier opt
Disjunction
)
”에 대한 참조는 “
Atom ::
(
GroupSpecifier opt
Disjunction
)
” 또는 “
ExtendedAtom
::
(
GroupSpecifier opt
Disjunction
)
”로 해석되어야 한다.
B.1.2.3 정적 의미론: IsCharacterClass
22.2.1.6 의
의미론은 다음과 같이 확장된다:
ClassAtomNoDash
::
\
[lookahead = c ]
false 를 반환한다.
B.1.2.4 정적 의미론: CharacterValue
22.2.1.7 의 의미론은
다음과 같이 확장된다:
ClassAtomNoDash
::
\
[lookahead = c ]
U+005C(REVERSE SOLIDUS)의 숫자 값을 반환한다.
ClassEscape
::
c
ClassControlLetter
ch 를 ClassControlLetter 에 의해
일치된 코드 포인트로 한다.
i 를 ch 의 숫자 값으로 한다.
i 를 32로 나눈 나머지를 반환한다.
CharacterEscape
:: LegacyOctalEscapeSequence
LegacyOctalEscapeSequence 의
MV를 반환한다( 12.9.4.3 참조).
B.1.2.5 실행 의미론: CompileSubpattern
CompileSubpattern 의 의미론은 다음과 같이 확장된다:
Term ::
QuantifiableAssertion
Quantifier
규칙은
Term ::
Atom
Quantifier
규칙과 동일하지만, QuantifiableAssertion 이
Atom 대신 대입된다.
Term ::
ExtendedAtom
Quantifier
규칙은
Term ::
Atom
Quantifier
규칙과 동일하지만, ExtendedAtom 이 Atom 대신 대입된다.
Term :: ExtendedAtom
규칙은
Term :: Atom
규칙과 동일하지만, ExtendedAtom 이 Atom 대신 대입된다.
B.1.2.6 실행 의미론: CompileAssertion
CompileAssertion 규칙에서
Assertion
::
(?=
Disjunction
)
및
Assertion
::
(?!
Disjunction
)
생성식이 QuantifiableAssertion 생성식에도
사용되지만, QuantifiableAssertion 이
Assertion 대신 대입된다.
B.1.2.7 실행 의미론: CompileAtom
CompileAtom 규칙은 Atom 생성식에 적용되지만
Atom :: PatternCharacter
를 제외하고, ExtendedAtom 생성식에도 적용되며, ExtendedAtom 이 Atom 대신 대입된다. 다음과 같은
direction 매개변수를 가진 규칙도 추가된다:
ExtendedAtom
::
\
[lookahead = c ]
A 를 문자 \ U+005C(REVERSE SOLIDUS)를 포함하는 CharSet 으로 한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
ExtendedAtom
:: ExtendedPatternCharacter
ch 를 ExtendedPatternCharacter 가
나타내는 문자로 한다.
A 를 문자 ch 를 포함하는 1-요소 CharSet 으로 한다.
CharacterSetMatcher (rer ,
A , false , direction )을 반환한다.
B.1.2.8 실행 의미론: CompileToCharSet
22.2.2.9 의 의미론은 다음과 같이 확장된다:
다음 두 규칙은 CompileToCharSet 의 해당 규칙을 대체한다.
NonemptyClassRanges
::
ClassAtom
-
ClassAtom
ClassContents
A 를 첫 번째 ClassAtom 에 대해 CompileToCharSet (rer )로
한다.
B 를 두 번째 ClassAtom 에 대해 CompileToCharSet (rer )로
한다.
C 를 ClassContents 에 대해 CompileToCharSet (rer )로
한다.
D 를 CharacterRangeOrUnion (rer ,
A , B )로 한다.
D 와 C 의 합집합을 반환한다.
NonemptyClassRangesNoDash
::
ClassAtomNoDash
-
ClassAtom
ClassContents
A 를 ClassAtomNoDash 에 대해
CompileToCharSet (rer )로
한다.
B 를 ClassAtom 에 대해 CompileToCharSet (rer )로
한다.
C 를 ClassContents 에 대해 CompileToCharSet (rer )로
한다.
D 를 CharacterRangeOrUnion (rer ,
A , B )로 한다.
D 와 C 의 합집합을 반환한다.
또한, 아래 규칙들이 CompileToCharSet 에 추가된다.
ClassEscape
::
c
ClassControlLetter
cv 를 이 ClassEscape 의 CharacterValue 로
한다.
c 를 문자 값이 cv 인 문자로 한다.
c 만 포함하는 CharSet 을 반환한다.
ClassAtomNoDash
::
\
[lookahead = c ]
문자 \ U+005C(REVERSE SOLIDUS)만 포함하는 CharSet 을 반환한다.
참고
이 생성식은 문자 클래스 내에서 \c 시퀀스에서 뒤에 허용되는 제어 문자가 오지 않을 때만
도달할 수 있다.
B.1.2.8.1 CharacterRangeOrUnion ( rer ,
A , B )
추상 연산 CharacterRangeOrUnion은 rer (RegExp
Record ), A (CharSet ),
B (CharSet ) 인수를 받아 CharSet 을 반환한다. 호출될 때 다음 단계를 수행한다:
HasEitherUnicodeFlag (rer )
가 false 이면
A 에 정확히 하나의 문자만 포함되어 있지 않거나 B 에 정확히 하나의 문자만 포함되어 있지
않으면
C 를 문자 - U+002D(HYPHEN-MINUS)만 포함하는
CharSet 으로 한다.
A , B , C 의 CharSets 의 합집합을
반환한다.
CharacterRange (A ,
B )를 반환한다.
B.1.2.9 정적 의미론: ParsePattern ( patternText ,
u , v )
22.2.3.4 의 의미론은 다음과 같이 확장된다:
추상 연산 ParsePattern 은 patternText (유니코드 코드
포인트의 시퀀스), u (불리언), v (불리언) 인수를 받아, 호출 시 다음 단계를 수행한다:
v 가 true 이고 u 가 true 이면,
parseResult 를 하나 이상의 SyntaxError 객체를 포함하는
List 로
한다.
그렇지 않고 v 가 true 이면,
parseResult 를 ParseText (patternText ,
Pattern [+UnicodeMode,
+UnicodeSetsMode,
+NamedCaptureGroups] )로 한다.
그렇지 않고 u 가 true 이면,
parseResult 를 ParseText (patternText ,
Pattern [+UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )로 한다.
그 밖의 경우,
parseResult 를 ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
~NamedCaptureGroups] )로 한다.
parseResult 가 Parse
Node 이고 parseResult 가 GroupName 을 포함하면,
parseResult 를 ParseText (patternText ,
Pattern [~UnicodeMode,
~UnicodeSetsMode,
+NamedCaptureGroups] )로
설정한다.
parseResult 를 반환한다.
B.2 추가 내장 속성
ECMAScript 호스트 가 웹 브라우저인 경우 표준
내장 객체의 다음 추가 프로퍼티가 정의된다.
B.2.1 전역 객체의 추가 속성
표 102 의 항목들이
표 6 에 추가된다.
표 102: 추가로 잘 알려진 내장 객체
B.2.1.1 escape ( string )
이 함수는 전역
객체 의 프로퍼티이다. 이는 특정 코드 유닛이 16진수 이스케이프 시퀀스로 치환된 새로운 String 값을 계산한다.
숫자 값이 0x00FF 이하인 코드 유닛을 치환할 때는 %xx 형태의 두 자리 이스케이프 시퀀스를 사용한다. 숫자 값이
0x00FF를 초과하는 코드 유닛을 치환할 때는 %uxxxx 형태의 네 자리 이스케이프 시퀀스를 사용한다.
이것은 %escape% 내장 객체이다.
호출 시 아래 단계를 수행한다:
string 을 ? ToString (string )으로 설정한다.
len 을 string 의 길이로 한다.
R 을 빈 문자열로 한다.
unescapedSet 을 string-concatenation 으로 ASCII 워드 문자 와
"@*+-./" 을 합친 값으로 한다.
k 를 0으로 한다.
k < len 동안 반복한다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 한다.
unescapedSet 에 C 가 포함되어 있으면,
S 를 C 로 한다.
그렇지 않으면,
n 을 C 의 숫자 값으로 한다.
n < 256이면,
hex 를 n 의 대문자 16진수 문자열로 한다.
S 를 string-concatenation
으로 "%" 와 StringPad (hex ,
2, "0" , start )을 합친
값으로 한다.
그 밖의 경우,
hex 를 n 의 대문자 16진수 문자열로 한다.
S 를 string-concatenation
으로 "%u" 와 StringPad (hex ,
4, "0" , start )을 합친
값으로 한다.
R 을 string-concatenation 으로
R 과 S 를 합친 값으로 한다.
k 를 k + 1로 한다.
R 을 반환한다.
참고
인코딩은 부분적으로 RFC 1738에서 설명된 인코딩을 기반으로 하지만, 이 표준에서 지정된 전체 인코딩은 RFC 1738의 내용과 상관없이 위에
설명되어 있다. 이 인코딩은 RFC 3986에 의해 RFC 1738에 적용된 변경 사항을 반영하지 않는다.
B.2.1.2 unescape ( string )
이 함수는 전역
객체 의 프로퍼티이다. 이는 escape 함수로 생성될 수 있는 모든 종류의 이스케이프 시퀀스가 그에
해당하는 코드 유닛으로 치환된 새로운 String 값을 계산한다.
이것은 %unescape% 내장 객체이다.
호출 시 아래 단계를 수행한다:
string 을 ? ToString (string )으로 설정한다.
len 을 string 의 길이로 한다.
R 을 빈 문자열로 한다.
k 를 0으로 한다.
k < len 동안 반복한다,
C 를 string 의 인덱스 k 에 있는 코드 유닛으로 한다.
C 가 0x0025(PERCENT SIGN) 코드 유닛이면,
hexDigits 를 빈 문자열로 한다.
optionalAdvance 를 0으로 한다.
k + 5 < len 이고 string 의 인덱스
k + 1 코드 유닛이 0x0075 (LATIN SMALL LETTER U)이면,
hexDigits 를 substring 으로
string 의 k + 2부터 k + 6까지로
한다.
optionalAdvance 를 5로 한다.
그 밖에 k + 3 ≤ len 이면,
hexDigits 를 substring 으로
string 의 k + 1부터 k + 3까지로
한다.
optionalAdvance 를 2로 한다.
parseResult 를 ParseText (hexDigits ,
HexDigits [~Sep] )로
한다.
parseResult 가 Parse
Node 이면,
n 을 parseResult 의 MV로 한다.
C 를 숫자 값이 n 인 코드 유닛으로 한다.
k 를 k +
optionalAdvance 로 한다.
R 을 string-concatenation 으로
R 과 C 를 합친 값으로 한다.
k 를 k + 1로 한다.
R 을 반환한다.
B.2.2 String.prototype 객체의 추가 속성
B.2.2.1 String.prototype.substr ( start ,
length )
이 메서드는 this 값을 String으로 변환한 결과의 substring 을
반환한다. 시작 인덱스는 start 이고, length 코드 유닛(또는 length 가
undefined 이면 문자열 끝까지)이다. start 가 음수이면 sourceLength +
start 로 취급한다. sourceLength 는 String의 길이이다. 결과는 String 값 이며, String
객체가 아니다.
호출 시 아래 단계를 수행한다:
O 를 ? RequireObjectCoercible (this
value)로 한다.
S 를 ? ToString (O )로 한다.
size 를 S 의 길이로 한다.
intStart 를 ? ToIntegerOrInfinity (start )로
한다.
intStart = -∞이면, intStart 를 0으로 설정한다.
그 밖에 intStart < 0이면, intStart 를 max (size +
intStart , 0)로 한다.
그 밖에는 intStart 를 min (intStart , size )로
한다.
length 가 undefined 이면 intLength 를
size 로 하고, 그렇지 않으면 intLength 를 ? ToIntegerOrInfinity (length )로
한다.
intLength 를 clamping 으로 0과 size 사이로 제한한다.
intEnd 를 min (intStart +
intLength , size )로 한다.
S 의 intStart 부터 intEnd 까지의 substring 을 반환한다.
참고
이 메서드는 의도적으로 제네릭이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의 객체에
메서드로 전달해서 사용할 수 있다.
B.2.2.2 String.prototype.anchor ( name )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"a" , "name" , name )을 반환한다.
B.2.2.2.1 CreateHTML ( string , tag ,
attribute , value )
추상 연산 CreateHTML은 string (ECMAScript 언어
값 ), tag (문자열), attribute (문자열),
value (ECMAScript 언어 값 ) 인수를 받아,
문자열을 포함하는 정상 완료
또는 throw 완료 를 반환한다.
호출 시 아래 단계를 수행한다:
str 를 ? RequireObjectCoercible (string )로
한다.
S 를 ? ToString (str )로 한다.
p1 을 string-concatenation 으로
"<" 과 tag 를 합친 값으로 한다.
attribute 가 빈 문자열이 아니면,
V 를 ? ToString (value )로
한다.
escapedV 를 V 와 동일하되, V 에서 0x0022(QUOTATION
MARK) 코드 유닛이 나타날 때마다 """ 로 치환된 값으로 한다.
p1 을 string-concatenation 으로
다음을 합친 값으로 한다:
p1
0x0020 (SPACE) 코드 유닛
attribute
0x003D (EQUALS SIGN) 코드 유닛
0x0022 (QUOTATION MARK) 코드 유닛
escapedV
0x0022 (QUOTATION MARK) 코드 유닛
p2 를 string-concatenation 으로
p1 과 ">" 을 합친 값으로 한다.
p3 를 string-concatenation 으로
p2 와 S 를 합친 값으로 한다.
p4 를 string-concatenation 으로
p3 , "</" , tag ,
">" 을 합친 값으로 한다.
p4 를 반환한다.
B.2.2.3 String.prototype.big ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"big" , "" , "" )을 반환한다.
B.2.2.4 String.prototype.blink ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"blink" , "" , "" )을 반환한다.
B.2.2.5 String.prototype.bold ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"b" , "" , "" )을 반환한다.
B.2.2.6 String.prototype.fixed ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"tt" , "" , "" )을 반환한다.
B.2.2.7 String.prototype.fontcolor ( colour )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"font" , "color" , colour )을 반환한다.
B.2.2.8 String.prototype.fontsize ( size )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"font" , "size" , size )을 반환한다.
B.2.2.9 String.prototype.italics ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"i" , "" , "" )을 반환한다.
B.2.2.10 String.prototype.link ( url )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"a" , "href" , url )을 반환한다.
B.2.2.11 String.prototype.small ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"small" , "" , "" )을 반환한다.
B.2.2.12 String.prototype.strike ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"strike" , "" , "" )을 반환한다.
B.2.2.13 String.prototype.sub ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"sub" , "" , "" )을 반환한다.
B.2.2.14 String.prototype.sup ( )
이 메서드는 호출 시 아래 단계를 수행한다:
S 를 this 값으로 한다.
? CreateHTML (S ,
"sup" , "" , "" )을 반환한다.
B.2.2.15 String.prototype.trimLeft ( )
참고
"trimStart" 프로퍼티가 권장된다. "trimLeft" 프로퍼티는 주로 기존
코드와의 호환을 위해 제공된다. 새로운 ECMAScript 코드는 "trimStart" 프로퍼티를 사용하는 것이
권장된다.
"trimLeft" 프로퍼티의 초기 값은 22.1.3.34 에서 정의된
%String.prototype.trimStart%이다.
B.2.2.16 String.prototype.trimRight ( )
참고
"trimEnd" 프로퍼티가 권장된다. "trimRight" 프로퍼티는 주로 기존
코드와의 호환을 위해 제공된다. 새로운 ECMAScript 코드는 "trimEnd" 프로퍼티를 사용하는 것이
권장된다.
"trimRight" 프로퍼티의 초기 값은 22.1.3.33 에서 정의된
%String.prototype.trimEnd%이다.
B.2.3 Date.prototype 객체의 추가 속성
B.2.3.1 Date.prototype.getYear ( )
참고
getFullYear 메서드가 거의 모든 목적에 권장된다. 이 메서드는 “2000년 문제”를 피할 수 있기 때문이다.
이 메서드는 호출 시 아래 단계를 수행한다:
dateObject 를 this 값으로 한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 를 dateObject .[[DateValue]] 로 한다.
t 가 NaN 이면 NaN 을 반환한다.
YearFromTime (LocalTime (t )) -
1900 𝔽 를 반환한다.
B.2.3.2 Date.prototype.setYear ( year )
참고
setFullYear 메서드가 거의 모든 목적에 권장된다. 이 메서드는 “2000년 문제”를 피할 수 있기 때문이다.
이 메서드는 호출 시 아래 단계를 수행한다:
dateObject 를 this 값으로 한다.
? RequireInternalSlot (dateObject ,
[[DateValue]] )를 수행한다.
t 를 dateObject .[[DateValue]] 로 한다.
y 를 ? ToNumber (year )로 한다.
t 가 NaN 이면 t 를
+0 𝔽 로, 그렇지 않으면 LocalTime (t )로
한다.
yyyy 를 MakeFullYear (y )로 한다.
d 를 MakeDay (yyyy , MonthFromTime (t ),
DateFromTime (t ))로 한다.
date 를 MakeDate (d , TimeWithinDay (t ))로 한다.
u 를 TimeClip (UTC (date ))로 한다.
dateObject .[[DateValue]] 를 u 로 설정한다.
u 를 반환한다.
B.2.3.3 Date.prototype.toGMTString ( )
참고
toUTCString 메서드가 권장된다. 이 메서드는 주로 기존 코드와의 호환을 위해 제공된다.
"toGMTString" 프로퍼티의 초기 값은 21.4.4.43 에서 정의된
%Date.prototype.toUTCString%이다.
B.2.4 RegExp.prototype 객체의 추가 속성
B.2.4.1 RegExp.prototype.compile ( pattern ,
flags )
이 메서드는 호출 시 아래 단계를 수행한다:
O 를 this 값으로 한다.
? RequireInternalSlot (O ,
[[RegExpMatcher]] )를 수행한다.
pattern 이 객체 이고 pattern 에 [[RegExpMatcher]] 내부 슬롯이 있으면,
flags 가 undefined 가 아니면
TypeError 예외를 throw한다.
P 를 pattern .[[OriginalSource]] 로 한다.
F 를 pattern .[[OriginalFlags]] 로
한다.
그 밖에는,
P 를 pattern 으로 한다.
F 를 flags 로 한다.
? RegExpInitialize (O ,
P , F )를 반환한다.
참고
이 메서드는 this 값 RegExp를 새로운 패턴과 플래그로 완전히 재초기화한다. 구현체는 이 메서드 사용을 결과
RegExp 객체가 여러 번 사용될 것이며 추가 최적화 후보라는 단언으로 해석할 수 있다.
B.3 기타 추가 기능
B.3.1 라벨이 지정된 함수 선언
ECMAScript 2015 이전에는 LabelledStatement 의 명세가 FunctionDeclaration 에 문장 라벨을
연관시키는 것을 허용하지 않았다. 그러나 라벨이 지정된 FunctionDeclaration 은 비엄격 코드 에
허용되는 확장이었고, 대부분의 브라우저 기반 ECMAScript 구현체가 이를 지원했다. ECMAScript 2015 이후에는 LabelledStatement 에 대한 문법 생성식이
FunctionDeclaration 을
LabelledItem 으로 사용할 수 있도록
허용하지만, 14.13.1 에서는
해당 경우에 구문 오류(Syntax Error)를 발생시키는 Early Error 규칙이 있다. 그 규칙은 강조된 텍스트가 추가되어 수정된다:
LabelledItem : FunctionDeclaration
이 생성식에 의해 엄격 모드 코드 인 소스 텍스트가 일치하면 구문
오류(Syntax Error)이다.
참고
B.3.2 블록 레벨 함수 선언 웹 레거시 호환 의미론
ECMAScript 2015 이전에는 ECMAScript 명세가 FunctionDeclaration 이 Block 문장의 StatementList 의 요소로 등장하는 경우를 정의하지 않았다. 그러나 그런 형태의
FunctionDeclaration 지원은
허용되는 확장이었고, 대부분의 브라우저 기반 ECMAScript 구현체가 이를 허용했다. 불행히도 그러한 선언의 의미론은 구현체마다 다르다. 이러한 의미론적 차이 때문에,
해당 선언을 사용하는 기존 웹 ECMAScript 소스 텍스트 는 이러한 선언에 대한 모든 브라우저 구현체의 의미론적
교집합에만 의존할 경우에만 이식 가능하다. 다음은 그 교집합 의미론에 속하는 사용 사례이다:
함수가 선언되고 오직 하나의 블록 내에서만 참조되는 경우.
함수가 선언되고 하나의 Block 내에서만 사용될 수
있지만, 그 블록에 포함되지 않은 내부 함수 정의에서 참조되는 경우.
함수가 선언되고 하나의 블록 내에서만 사용될 수 있지만, 이후의 블록 내에서 참조되는 경우.
첫 번째 사용 사례는 ECMAScript 2015에서 제공되는 Block 레벨 함수 선언 의미론과 상호 운용 가능하다. 해당 사용 사례를 사용하는 기존
ECMAScript 소스
텍스트 는 10 ,
14 , 15 절에 정의된 Block 레벨
함수 선언 의미론을 사용하여 동작한다.
두 번째 및 세 번째 사용 사례에 대한 ECMAScript 2015 상호 운용성을 위해서는 10 절, 15 절, 19.2.1 절, 16.1.7 절 의미론에 대한 다음과 같은 확장이
필요하다.
ECMAScript 구현체가 진단 경고 메시지를 보고하는 메커니즘을 제공하는 경우, 이러한 호환 의미론이 적용되어 비호환 의미론과 관찰 가능한 차이를 일으키는 FunctionDeclaration 이 포함된
코드에 대해 경고가 표시되어야 한다. 예를 들어, var 바인딩의 도입이 early error 를 발생시키기 때문에 도입되지 않는 경우에는 경고 메시지를 표시하지 않아야
한다.
B.3.2.1 FunctionDeclarationInstantiation의 변경 사항
FunctionDeclarationInstantiation
중에 아래 단계들이 31 단계
대신 수행된다:
strict 가 false 이면,
아래 조건을 만족하는 모든 FunctionDeclaration
f 에 대하여: code Contains
x 가 true 인, StatementList 가 어떤 Block , CaseClause ,
DefaultClause x 에
직접 포함되어 있는 경우
F 를 f 의 BindingIdentifier 의
StringValue 로
한다.
FunctionDeclaration
f 를 F 를 BindingIdentifier 로
갖는 VariableStatement 로
대체할 때 func 에 Early Error가 발생하지 않고,
parameterNames 에 F 가 포함되어 있지 않으면,
NOTE: F 에 대한 var 바인딩은 여기서 VarDeclaredName, 함수의 형식
매개변수 이름, 또는 다른 FunctionDeclaration 이
아닌 경우에만 인스턴스화된다.
instantiatedVarNames 에 F 가 없고
F 가 "arguments" 가 아니면,
! varEnv .CreateMutableBinding(F ,
false )를 수행한다.
! varEnv .InitializeBinding(F ,
undefined )를 수행한다.
F 를 instantiatedVarNames 에 추가한다.
FunctionDeclaration
f 가 평가될 때, Evaluation
알고리즘(15.2.6 )
대신 다음 단계를 수행한다:
fEnv 를 실행 중인 실행
컨텍스트 의 VariableEnvironment로
한다.
bEnv 를 실행 중인 실행
컨텍스트 의 LexicalEnvironment로 한다.
fObj 를
! bEnv .GetBindingValue(F ,
false )로 한다.
! fEnv .SetMutableBinding(F ,
fObj , false )를 수행한다.
unused 를 반환한다.
B.3.2.2 GlobalDeclarationInstantiation의 변경 사항
GlobalDeclarationInstantiation
중에 아래 단계들이 12 단계
대신 수행된다:
아래 단계들을 수행한다:
strict 를 script 의 ScriptIsStrict 로 한다.
strict 가 false 이면,
declaredFunctionOrVarNames 를
declaredFunctionNames 와 declaredVarNames 의
list-concatenation 로
한다.
아래 조건을 만족하는 모든 FunctionDeclaration
f 에 대하여: script Contains
x 가 true 인, StatementList 가 어떤
Block ,
CaseClause , 또는 DefaultClause
x 에 직접 포함되어 있는 경우
F 를 f 의 BindingIdentifier 의
StringValue 로
한다.
FunctionDeclaration
f 를 F 를 BindingIdentifier 로
갖는 VariableStatement 로
대체할 때 script 에 Early Error가 발생하지 않으면,
HasLexicalDeclaration (env ,
F )가 false 이면,
fnDefinable 을 ? CanDeclareGlobalVar (env ,
F )로 한다.
fnDefinable 이
true 이면,
NOTE: F 에 대한 var 바인딩은 여기서
VarDeclaredName도 아니고, 다른 FunctionDeclaration 의
이름도 아닌 경우에만 인스턴스화된다.
declaredFunctionOrVarNames 에
F 가 없으면,
? CreateGlobalVarBinding (env ,
F ,
false )를
수행한다.
F 를
declaredFunctionOrVarNames 에
추가한다.
FunctionDeclaration
f 가 평가될 때, Evaluation
알고리즘(15.2.6 )
대신 아래 단계를 수행한다:
gEnv 를 실행
중인 실행
컨텍스트 의
VariableEnvironment로 한다.
bEnv 를 실행
중인 실행
컨텍스트 의
LexicalEnvironment로 한다.
fObj 를
! bEnv .GetBindingValue(F ,
false )로
한다.
? gEnv .SetMutableBinding (F ,
fObj ,
false )를
수행한다.
unused 를
반환한다.
B.3.2.3 EvalDeclarationInstantiation의 변경 사항
EvalDeclarationInstantiation
중에 아래 단계들이 13 단계
대신 수행된다:
strict 가 false 이면,
declaredFunctionOrVarNames 를 declaredFunctionNames 와
declaredVarNames 의 list-concatenation 로 한다.
아래 조건을 만족하는 모든 FunctionDeclaration
f 에 대하여: body Contains
x 가 true 인, StatementList 가 어떤 Block , CaseClause ,
DefaultClause x 에
직접 포함되어 있는 경우
F 를 f 의 BindingIdentifier 의
StringValue 로
한다.
FunctionDeclaration
f 를 F 를 BindingIdentifier 로
갖는 VariableStatement 로
대체할 때 body 에 Early Error가 발생하지 않으면,
bindingExists 를 false 로 한다.
thisEnv 를 lexEnv 로 한다.
Assert : 아래 반복문은 종료된다.
thisEnv 가 varEnv 가 아닐 동안 반복한다,
thisEnv 가 객체가
아닌 Environment
Record 이면,
! thisEnv .HasBinding(F )이
true 이면,
bindingExists 를
true 로 한다.
thisEnv 를 thisEnv .[[OuterEnv]] 로 한다.
bindingExists 가 false 이고
varEnv 가 Global
Environment Record 이면,
HasLexicalDeclaration (varEnv ,
F )가 false 이면,
fnDefinable 을 ? CanDeclareGlobalVar (varEnv ,
F )로 한다.
그 밖에는,
fnDefinable 을
false 로 한다.
그 밖에는,
fnDefinable 을 true 로 한다.
bindingExists 가 false 이고
fnDefinable 이 true 이면,
declaredFunctionOrVarNames 에 F 가
없으면,
varEnv 가 Global
Environment Record 이면,
? CreateGlobalVarBinding (varEnv ,
F ,
true )를 수행한다.
그 밖에는,
bindingExists 를
! varEnv .HasBinding(F )로
한다.
bindingExists 가
false 이면,
! varEnv .CreateMutableBinding(F ,
true )를
수행한다.
! varEnv .InitializeBinding(F ,
undefined )를
수행한다.
F 를
declaredFunctionOrVarNames 에 추가한다.
FunctionDeclaration
f 가 평가될 때, Evaluation
알고리즘(15.2.6 )
대신 아래 단계를 수행한다:
gEnv 를 실행
중인 실행 컨텍스트 의
VariableEnvironment로 한다.
bEnv 를 실행
중인 실행 컨텍스트 의
LexicalEnvironment로 한다.
fObj 를
! bEnv .GetBindingValue(F ,
false )로 한다.
? gEnv .SetMutableBinding (F ,
fObj , false )를
수행한다.
unused 를 반환한다.
B.3.2.4 Block 정적 의미론: 초기 에러의 변경 사항
14.2.1 의 아래 생성식에 대한
규칙은 강조된 텍스트가 추가되어 수정된다:
Block :
{
StatementList
}
B.3.2.5 switch 문 정적 의미론: 초기 에러의 변경 사항
14.12.1 의
아래 생성식에 대한 규칙은 강조된 텍스트가 추가되어 수정된다:
SwitchStatement
:
switch
(
Expression
)
CaseBlock
B.3.2.6 BlockDeclarationInstantiation의 변경 사항
BlockDeclarationInstantiation
중에 아래 단계들이 3.a.ii.1 단계
대신 수행된다:
! env .HasBinding(dn )이 false 이면
! env .CreateMutableBinding(dn ,
false )를 수행한다.
BlockDeclarationInstantiation
중에 아래 단계들이 3.b.iii 단계
대신 수행된다:
다음 단계를 수행한다:
env 에서 fn 의 바인딩이 초기화되지 않은 바인딩이면,
! env .InitializeBinding(fn ,
fo )를 수행한다.
그 밖에는,
Assert : d 는 FunctionDeclaration 이다.
! env .SetMutableBinding(fn ,
fo , false )를 수행한다.
B.3.3 IfStatement 문의 구문 절에서의 FunctionDeclarations
다음은 IfStatement 생성 규칙을
14.6 에 추가합니다:
IfStatement [Yield, Await,
Return] :
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
else
Statement [?Yield, ?Await,
?Return]
if
(
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
else
FunctionDeclaration [?Yield,
?Await, ~Default]
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
else
FunctionDeclaration [?Yield,
?Await, ~Default]
if
(
Expression [+In, ?Yield,
?Await]
)
FunctionDeclaration [?Yield,
?Await, ~Default]
[lookahead ≠ else ]
이 생성 규칙은 비엄격
코드 구문을 파싱할 때만 적용됩니다. 이 생성 규칙에 의해 매칭된 소스
텍스트 는 각 FunctionDeclaration [?Yield,
?Await, ~Default] 의 발생을 해당 소스 텍스트의 그 위치에 있는 StatementListItem 의 유일한
BlockStatement 인 것처럼 처리합니다.
이러한 합성 BlockStatement 의 의미론은
B.3.2 에서
명시된 웹 레거시 호환 의미론을 포함합니다.
B.3.4 Catch 블록 내 VariableStatements
14.15.1 하위 절의 내용을
다음으로 대체합니다:
Catch :
catch
(
CatchParameter
)
Block
참고
Catch 절의 Block 에는 CatchParameter 가 바인딩한 이름과
동일한 이름을 바인딩하는 var 선언이 포함될 수 있습니다. 런타임에는 이러한 바인딩이
VariableDeclarationEnvironment에 생성됩니다. 이들은 CatchParameter 에 의해 도입된 동명의 바인딩을 가리지
않으며, 따라서 해당 var 선언의 Initializer 는 var 바인딩이 아니라
catch 파라미터에 할당됩니다.
이 수정된 동작은 Block 내 Catch 절에 포함된 직접 eval 호출에 의해
도입된 var와 function 선언에도 적용됩니다. 이 변경은 19.2.1.3 알고리즘을 다음과 같이 수정하여
구현됩니다:
3.d.i.2.a.i
단계를 다음으로 대체합니다:
thisEnv 가 Catch 절의
Environment Record 가 아니면
SyntaxError 예외를 throw합니다.
13.b.ii.4.a.i.i
단계를 다음으로 대체합니다:
thisEnv 가 Catch 절의
Environment Record 가 아니면
bindingExists 를 true 로 합니다.
B.3.5 ForIn 문 헤드의 Initializer
다음은 ForInOfStatement
생성 규칙을 14.7.5 에 추가합니다:
ForInOfStatement [Yield,
Await, Return] :
for
(
var
BindingIdentifier [?Yield,
?Await]
Initializer [~In, ?Yield,
?Await]
in
Expression [+In, ?Yield,
?Await]
)
Statement [?Yield, ?Await,
?Return]
이 생성 규칙은 비엄격
코드 구문을 파싱할 때만 적용됩니다.
정적 의미론 중 ContainsDuplicateLabels
(8.3.1 ) 규칙은 다음과 같이
보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement 의 ContainsDuplicateLabels 을
labelSet 인자로 반환한다.
정적 의미론 중 ContainsUndefinedBreakTarget
(8.3.2 ) 규칙은 다음과
같이 보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement 의 ContainsUndefinedBreakTarget 을
labelSet 인자로 반환한다.
정적 의미론 중 ContainsUndefinedContinueTarget
(8.3.3 ) 규칙은
다음과 같이 보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement 의 ContainsUndefinedContinueTarget 을
iterationSet 과 « » 인자로 반환한다.
정적 의미론 중 IsDestructuring (14.7.5.2 ) 규칙은 다음과 같이 보강됩니다:
BindingIdentifier
:
Identifier
yield
await
false 를 반환한다.
정적 의미론 중 VarDeclaredNames (8.2.6 ) 규칙은 다음과 같이 보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
names1 을 BindingIdentifier 의 BoundNames 로 둔다.
names2 를 Statement 의 VarDeclaredNames 로
둔다.
names1 과 names2 의 리스트 연결 을 반환한다.
정적 의미론 중 VarScopedDeclarations
(8.2.7 ) 규칙은 다음과 같이
보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
declarations1 을 « BindingIdentifier »로 둔다.
declarations2 를 Statement 의 VarScopedDeclarations 로
둔다.
declarations1 과 declarations2 의 리스트 연결 을 반환한다.
실행
의미론 중 ForInOfLoopEvaluation
(14.7.5.5 ) 규칙은 다음과 같이
보강됩니다:
ForInOfStatement
:
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
bindingId 를 BindingIdentifier 의 StringValue 로 둔다.
lhs 를 ? ResolveBinding (bindingId )로 둔다.
IsAnonymousFunctionDefinition (Initializer )가
true 면,
value 를 ? NamedEvaluation of Initializer with
argument bindingId 로 둔다.
그 외의 경우,
rhs 를 ? Evaluation of
Initializer 로
둔다.
value 를 ? GetValue (rhs )로 둔다.
? PutValue (lhs , value )를
수행한다.
keyResult 를 ? ForIn/OfHeadEvaluation (« », Expression ,
enumerate )로 둔다.
? ForIn/OfBodyEvaluation (BindingIdentifier ,
Statement ,
keyResult , enumerate ,
var-binding , labelSet )를 반환한다.
B.3.6 [[IsHTMLDDA]] 내부 슬롯
[[IsHTMLDDA]] 내부 슬롯 은 호스트 정의 객체에 존재할 수
있습니다. [[IsHTMLDDA]] 내부 슬롯을 가진 객체는 ToBoolean 및 IsLooselyEqual 추상 연산 에서, 그리고
typeof 연산자 의 피연산자로 사용될 때
undefined 처럼 동작합니다.
참고
[[IsHTMLDDA]] 내부 슬롯을 가진 객체는 이 명세에서 생성되지 않습니다. 하지만 웹 브라우저의 document.all
객체 는 웹 호환성을 위해 이 슬롯을 가진 호스트 정의 이국적 객체 입니다. 이 유형의 객체는 다른 알려진
예시가 없으며, 구현체는 document.all을 제외하고는 이 슬롯을 가진 객체를 생성하지 않아야 합니다.
B.3.6.1 ToBoolean 변경사항
다음 단계는 3 단계를 ToBoolean 에서
대체합니다:
argument 가 객체 이고, argument 가 [[IsHTMLDDA]] 내부 슬롯을 가지고 있다면 false 를 반환한다.
B.3.6.2 IsLooselyEqual 변경사항
다음 단계는 4
단계를 IsLooselyEqual 에서 대체합니다:
다음 단계를 수행한다:
x 가 객체 이고, x 가 [[IsHTMLDDA]] 내부 슬롯을 가지고 있으며, y 가
undefined 또는 null 이면
true 를 반환한다.
x 가 undefined 또는 null 이고,
y 가 객체 이며 y 가 [[IsHTMLDDA]] 내부 슬롯을 가지고 있다면
true 를 반환한다.
B.3.6.3 typeof 연산자 변경사항
다음 단계는 12 단계를 typeof의 평가
의미론 에서 대체합니다:
val 이 [[IsHTMLDDA]] 내부 슬롯을 가지고 있다면,
"undefined" 를 반환한다.
B.3.7 HostMakeJobCallback의 비기본 동작
HostMakeJobCallback 추상 연산은 웹 브라우저인
호스트 가 비기본 동작을 지정할 수 있도록
허용합니다.
B.3.8 HostEnsureCanAddPrivateElement의 비기본 동작
HostEnsureCanAddPrivateElement
추상 연산은 웹 브라우저인 호스트 가 비기본
동작을 지정할 수 있도록 허용합니다.
B.3.9 함수 호출 할당 대상의 런타임 오류
함수 호출(13.3.6 )이 비엄격 코드 에서 할당 대상으로 사용될 때, 조기 오류 를 발생시키는 대신,
할당 평가 중에 ReferenceError 예외가 발생합니다.
참고
할당 대상이 LeftHandSideExpression 이고
AssignmentExpression 의 할당 연산자가
= 또는 AssignmentOperator 일 때만 허용되며, 논리 할당
연산자(??=, &&=, ||=)에서는 이 허용이 적용되지 않습니다.
자세한 내용은 1 단계 및 AssignmentTargetType 에서
다음의
CallExpression :
CoverCallExpressionAndAsyncArrowHead
및
CallExpression :
CallExpression
Arguments
를 참고하세요.
부록 C (정보용) ECMAScript의 엄격 모드
엄격 모드의 제한 및 예외
implements, interface, let, package,
private, protected, public, static, 그리고
yield는 예약어 이며, 엄격 모드
코드 내에서 사용이 제한됩니다. (12.7.2 ).
준수 구현체는 엄격 모드
코드 를 처리할 때, 다음 생성 규칙의 인스턴스를 허용하지 않아야 합니다
NumericLiteral ::
LegacyOctalIntegerLiteral
및
DecimalIntegerLiteral
:: NonOctalDecimalIntegerLiteral
.
준수 구현체는 엄격 모드
코드 를 처리할 때, 다음 생성 규칙의 인스턴스를 허용하지 않아야 합니다
EscapeSequence ::
LegacyOctalEscapeSequence
및
EscapeSequence ::
NonOctalDecimalEscapeSequence
.
선언되지 않은 식별자나 해결할 수 없는 참조에 할당하는 것은 전역 객체 에 프로퍼티를 생성하지 않습니다. 엄격 모드
코드 내에서 단순 할당이 발생할 때, 그 LeftHandSideExpression 은 해결할 수 없는 참조로 평가되어서는
안 됩니다. 만약 그렇다면 ReferenceError 예외가 발생합니다 (6.2.5.6 ). 또한 LeftHandSideExpression 이 { [[Writable]] : false }인 데이터 프로퍼티 에 대한 참조, { [[Set]] :
undefined }인 접근자 프로퍼티 에 대한 참조, 또는 [[Extensible]] 내부 슬롯이 false 인 객체의 존재하지 않는 프로퍼티에 대한 참조일 수도
없습니다. 이 경우 TypeError 예외가 발생합니다 (13.15 ).
StringValue 가
"eval" 또는 "arguments" 인 IdentifierReference 는 LeftHandSideExpression 의 대입
연산자(13.15 )나 UpdateExpression (13.4 ), 또는 Prefix 증감(13.4.4 ), Prefix 감소(13.4.5 ) 연산자의 UnaryExpression 으로 사용할 수 없습니다.
엄격 함수 의
Arguments 객체는 접근 시 TypeError 예외를 발생시키는, 설정 불가능한 접근자 프로퍼티 "callee" 를
정의합니다 (10.4.4.6 ).
엄격 함수 의
Arguments 객체는 해당 함수의 형식 파라미터 바인딩과 배열 인덱스 프로퍼티 값을 동적으로 공유하지 않습니다 (10.4.4 ).
엄격 함수 에서
Arguments 객체가 생성되면, 지역 식별자 arguments의 바인딩은 불변이며, 할당 표현식의 대상으로 사용할 수 없습니다 (10.2.11 ).
StringValue 가
"eval" 또는 "arguments" 인 BindingIdentifier 가 엄격 모드
코드 내에 존재하면 SyntaxError 입니다 (13.1.1 ).
엄격 모드 eval 코드에서는 호출자 eval의 변수 환경에 변수나 함수를 생성할 수 없습니다. 대신 새로운 변수 환경이 생성되고, 그 환경에서 eval 코드의 선언 바인딩이
이루어집니다 (19.2.1 ).
this 가 엄격 모드 코드 내에서 평가되면, this 값은
객체로 강제 변환되지 않습니다. this 값이 undefined 또는
null 이면 전역 객체 로 변환되지 않고, 원시 값도 래퍼 객체로 변환되지 않습니다. 함수 호출(
Function.prototype.apply 및 Function.prototype.call을 포함한)로 전달된
this 값도 객체로 강제 변환되지 않습니다 (10.2.1.2 , 20.2.3.1 , 20.2.3.3 ).
delete 연산자가 엄격 모드 코드 내에서 발생하면, 그 UnaryExpression 이 변수, 함수 인자, 함수 이름에 대한 직접 참조일 경우
SyntaxError 가 발생합니다 (13.5.1.1 ).
delete 연산자가 엄격 모드 코드 내에서 발생하면, 삭제하려는 프로퍼티의 속성이 { [[Configurable]] : false }이거나 삭제할 수 없는 경우
TypeError 가 발생합니다 (13.5.1.2 ).
엄격 모드
코드 에는 WithStatement 를 포함할 수 없습니다. 해당 문맥에서 WithStatement 가 발생하면
SyntaxError 입니다 (14.11.1 ).
CatchParameter 가 엄격 모드
코드 내에 발생하고, BoundNames 에 eval 또는
arguments가 포함되어 있으면 SyntaxError 입니다 (14.15.1 ).
BindingIdentifier 가 FormalParameters 내에 두 번 이상 나타나면
엄격 함수 에서
SyntaxError 입니다. Function, Generator, 또는 AsyncFunction 생성자 를 사용해 이런 함수를 생성하려
하면 SyntaxError 가 발생합니다 (15.2.1 ,
20.2.1.1.1 ).
구현체는 엄격
함수 내에서, 이 명세에 정의된 범위를 넘어 "caller" 또는
"arguments" 라는 이름을 가진 함수 인스턴스의 프로퍼티의 의미를 확장해서는 안 됩니다.
Annex D (informative) 호스트 계층화 지점
4.2 에서 호스트 의 정의를 확인하십시오.
D.1 호스트 후크
HostCallJobCallback (...)
HostEnqueueFinalizationRegistryCleanupJob (...)
HostEnqueueGenericJob (...)
HostEnqueuePromiseJob (...)
HostEnqueueTimeoutJob (...)
HostEnsureCanCompileStrings (...)
HostFinalizeImportMeta (...)
HostGetImportMetaProperties (...)
HostGrowSharedArrayBuffer (...)
HostHasSourceTextAvailable (...)
HostLoadImportedModule (...)
HostGetSupportedImportAttributes (...)
HostMakeJobCallback (...)
HostPromiseRejectionTracker (...)
HostResizeArrayBuffer (...)
InitializeHostDefinedRealm (...)
D.2 호스트 정의 필드
[[HostDefined]] (Realm Records 에서): 표
24 참고.
[[HostDefined]] (Script Records 에서): 표 39
참고.
[[HostDefined]] (Module Records 에서):
표
43 참고.
[[HostDefined]] (JobCallback Records 에서):
표
28 참고.
[[HostSynchronizesWith]] (Candidate Executions에서): 표 101 참고.
[[IsHTMLDDA]] : B.3.6 참고.
D.3 호스트 정의 객체
전역
객체 : 절 19 참고.
D.4 실행 중인 잡(Job)
Job Abstract
Closures 호출 전 준비 단계와 호출 후 정리 단계를 포함합니다. 9.5 참고.
D.5 이국적 객체의 내부 메서드
이 명세에 명시되지 않은 이국적
객체 에 대해, 표 4 의 필수 내부 메서드 중 아무 것이나 사용할 수 있습니다.
D.6 내장 객체 및 메서드
이 명세에 정의되지 않은 모든 내장 객체 및 메서드는 17.1 에서 제한된 것을 제외하고 사용 가능합니다.
Annex E (informative) ECMAScript 2015에서의
호환성에 영향을 줄 수 있는 수정 및 명확화
9.1.1.4.14 -9.1.1.4.17 5판과 5.1판에서는 새로운 전역 선언에 해당하는
전역 객체
프로퍼티가 이미 존재하는지 확인하기 위해 프로퍼티 존재 여부를 테스트했습니다. ECMAScript 2015는 자체 프로퍼티 존재 여부 테스트를 사용합니다. 이는 대부분의 웹 브라우저에서
일반적으로 구현된 방식과 일치합니다.
10.4.2.1 : 5판에서는 현재 배열
길이 캡처를 정수 로 변환하기 전에 수행했습니다.
하지만 변환 과정에 배열 길이를 변경하는 부작용이 발생할 수 있으므로, 캡처된 길이 값이 잘못될 수 있습니다. ECMAScript 2015는 이러한 부작용이 발생한 후에 현재 배열 길이를
캡처해야 한다고 명시합니다.
21.4.1.31 : 이전 판에서는
TimeClip 추상 연산이 0
시간 값 표현으로
+0 𝔽 또는 -0 𝔽 를 반환할 수 있었습니다. ECMAScript 2015는
반드시 +0 𝔽 가 반환되어야 한다고 명시합니다. 즉, ECMAScript 2015에서 Date의 시간
값 이 -0 𝔽 이 되는 경우는 없으며, 시간
값 을 반환하는 메서드가 -0 𝔽 을 반환하는 일도 없습니다.
21.4.1.32 : UTC 오프셋 표현이 없으면 로컬 시간대가 사용됩니다.
5.1판에서는 시간대가 없을 경우 "z" 로 해석해야 한다고 잘못 명시했습니다.
21.4.4.36 : 지정된 21.4.1.32 Date Time String Format으로 연도를 표현할 수
없으면 RangeError 예외가 발생합니다. 이전 판에서는 해당 상황의 동작을 명시하지 않았습니다.
21.4.4.41 : 이전 판에서는
Date.prototype.toString이 시간 값 이
NaN 일 때 반환값을 명시하지 않았습니다. ECMAScript 2015는 반환값을 문자열 "Invalid Date" 로
명시합니다.
22.2.4.1 , 22.2.6.13.1 : RegExp 인스턴스의
"source" 프로퍼티 값에 LineTerminator 코드 포인트가 있으면 이스케이프 시퀀스로 표현해야 합니다. 5.1판에서는
/만 이스케이프할 것을 요구했습니다.
22.2.6.8 , 22.2.6.11 : 이전 판에서는
String.prototype.match와 String.prototype.replace의 명세가 RegExp 값의
global 플래그가 설정된 경우에 대해 잘못되었습니다. 이전 명세는 패턴 일치 시도마다 lastIndex가 변하지 않으면 1씩 증가시켜야
한다고 했으나, 올바른 동작은 패턴이 빈 문자열과 일치할 때만 lastIndex를 1 증가시켜야 한다는 것입니다.
23.1.3.30 : 이전 판에서는 comparator 가
NaN 을 반환할 경우 Array.prototype.sort가 어떻게 동작하는지 명시하지 않았습니다. ECMAScript 2015는
이 값이 +0 𝔽 로 간주된다고 명시합니다. 또한 comparator 의 반환값에는 ToNumber 가 적용됩니다. 이전 판에서는
Number 타입이 아닌 값 을 반환할 경우의 효과가
구현
정의 였습니다. 실제로는 대부분의 구현에서 ToNumber 를 호출합니다.
Annex F (informative) 이전 판과의 비호환성을 유발하는 추가 및
변경 사항
6.2.5 : ECMAScript 2015에서는 함수 호출이
Reference Record 를 반환하는 것이 허용되지
않습니다.
7.1.4.1 : ECMAScript 2015에서는
ToNumber 가 String 값에 적용될
때 BinaryIntegerLiteral 과
OctalIntegerLiteral 숫자 문자열을
인식하고 변환합니다. 이전 판에서는 이러한 문자열이 NaN 으로 변환되었습니다.
9.3 : ECMAScript
2018에서는 템플릿 객체가 구문 노드 (소스 위치) 기준으로 정규화됩니다. 이전 판에서는 Realm 의 해당 템플릿 리터럴이나 태그드 템플릿의 모든 발생을
기준으로 했습니다.
12.2 :
ECMAScript 2016에서는 Unicode 8.0.0 이상이 필수입니다. ECMAScript 2015에서는 Unicode 5.1이 필수였습니다. 특히, U+180E 몽골 모음
구분자(Space_Separator 또는 Zs 범주, 2015판에서는 공백)였던 것이
Format(Cf) 범주로 이동했습니다(Unicode 6.3.0부터). 이로 인해 공백에 민감한 메서드의 동작이 달라집니다. 예를 들어,
"\u180E".trim().length는 이전 판에서는 0이었으나, ECMAScript 2016 및 이후 판에서는
1입니다. 또한, ECMAScript 2017에서는 항상 최신 Unicode 표준을 사용하도록 요구합니다.
12.7 : ECMAScript 2015에서는 IdentifierName 에 대해 Unicode 속성
“ID_Start”와 “ID_Continue”로 유효한 코드 포인트를 정의합니다. 이전 판에서는 유효한 IdentifierName 또는 Identifier 코드 포인트를 다양한 Unicode 코드 포인트 범주를 열거하여 정의했습니다.
12.10.1 : ECMAScript 2015에서는 자동
세미콜론 삽입이 do-while 문 끝에 세미콜론이 없을 때 이를 추가합니다. 이 변경은 대부분의 기존 구현의 실제 동작과 명세를 일치시킵니다.
13.2.5.1 : ECMAScript
2015에서는 객체 이니셜라이저에서 중복 프로퍼티 이름이 있어도 조기 오류 가 아닙니다.
13.15.1 :
ECMAScript 2015에서는 엄격 모드 코드 에서 FunctionExpression 의 함수 이름 같은 불변 바인딩에 할당할 때
조기 오류 가 발생하지 않고, 런타임
오류가 발생합니다.
14.2 : ECMAScript 2015에서는
StatementList 가 let 토큰으로 시작하고 그 뒤에
LineTerminator 와 Identifier 입력 요소가 오면 LexicalDeclaration 의 시작으로 간주합니다. 이전
판에서는 자동 세미콜론 삽입이 항상 Identifier 입력 요소 앞에
세미콜론을 삽입했습니다.
14.5 : ECMAScript 2015에서는 StatementListItem 이 let
토큰과 [ 토큰으로 시작하면 LexicalDeclaration 의 시작으로 간주합니다. 이전 판에서는 이 시퀀스가
ExpressionStatement 의 시작이었습니다.
14.6.2 : ECMAScript 2015에서는
IfStatement 의 정상 결과가
empty 값이 되는 일이 없습니다. 어떤 Statement 부분도 평가되지 않거나, 평가된 Statement 부분이 empty를 포함하는 정상 완료 를 생성하면, IfStatement 의 결과는
undefined 입니다.
14.7 : ECMAScript 2015에서는 for 문의 (
토큰 바로 뒤에 let [ 토큰 시퀀스가 오면 let이 LexicalDeclaration 의 시작으로 간주됩니다. 이전 판에서는 이 토큰 시퀀스가
Expression 의 시작이었습니다.
14.7 : ECMAScript 2015에서는 for-in 문의 ( 토큰 바로 뒤에
let [ 토큰 시퀀스가 오면 let이 ForDeclaration 의 시작으로 간주됩니다. 이전 판에서는 이 시퀀스가 LeftHandSideExpression 의 시작이었습니다.
14.7 : ECMAScript 2015 이전에는 in
키워드 앞의 VariableDeclaration 에 초기화 식이 올 수 있었습니다. ECMAScript
2015에서는 동일한 위치의 ForBinding 에서 이러한 초기화 식이
허용되지 않습니다. ECMAScript 2017에서는 이러한 초기화 식이 비엄격 코드 에서만 허용됩니다.
14.7 : ECMAScript 2015에서는 IterationStatement 를 평가한 결과가
[[Value]]가 empty인 정상 완료 가 되는 일이
없습니다. Statement 부분이 평가되지 않거나, IterationStatement 의 마지막 Statement 부분이 [[Value]]가 empty인 정상 완료 를 생성하면,
IterationStatement 의 결과는
[[Value]]가 undefined인 정상 완료 입니다.
14.11.2 : ECMAScript
2015에서는 WithStatement 를 평가한 결과가
[[Value]]가 empty인 정상 완료 가 되는 일이
없습니다. Statement 부분을 평가한 결과가 [[Value]]가 empty인 정상 완료 라면,
WithStatement 의 평가 결과는 [[Value]]가 undefined인 정상 완료 입니다.
14.12.4 : ECMAScript
2015에서는 SwitchStatement 를 평가한 결과가
[[Value]]가 empty인 정상 완료 가 되는 일이
없습니다. CaseBlock 부분을 평가한 결과가 [[Value]]가 empty인 정상 완료 라면,
SwitchStatement 의 평가 결과는 [[Value]]가 undefined인 정상 완료 입니다.
14.15 :
ECMAScript 2015에서는 Catch 절에 해당 Identifier 가 Catch 절의 파라미터로 나타날 때, 동일한 var 선언이 포함되어 있으면
조기 오류 입니다. 이전 판에서는 해당
변수 선언이 둘러싼 변수 환경에 생성되며, 선언의 Initializer
값이 Catch 파라미터에 할당되었습니다.
14.15 ,
19.2.1.3 : ECMAScript 2015에서는 Catch 절이 비엄격 직접 eval을 평가하고, eval 코드에
var 또는 FunctionDeclaration 선언이 해당 Identifier 를 바인딩하면 런타임 SyntaxError 가
발생합니다.
14.15.3 : ECMAScript
2015에서는 TryStatement 의 결과가
empty 값이 되는 일이 없습니다. Block 부분이 TryStatement 를 평가한 결과가 empty를 포함하는 정상 완료 라면, TryStatement 의 결과는
undefined 입니다. Block 부분이
TryStatement 를 평가한 결과가 throw 완료 이고, Catch 부분이 empty를 포함하는 정상 완료 라면, TryStatement 의 결과는
undefined 입니다(만약 Finally
절이 없거나, Finally 절의 평가 결과가
empty 인 정상 완료 인 경우).
15.4.5 ECMAScript
2015에서는 함수
객체 가 접근자 프로퍼티 의 [[Get]] 또는 [[Set]] 값으로 ObjectLiteral 에서 생성될 때, 생성자 함수가 아니며, "prototype" 자체
프로퍼티가 없습니다. 이전 판에서는 생성자였으며 "prototype" 프로퍼티가 있었습니다.
20.1.2.6 :
ECMAScript 2015에서는 Object.freeze의 인자가 객체가 아니면, 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전
판에서는 객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.1.2.8 : ECMAScript 2015에서는
Object.getOwnPropertyDescriptor의 인자가 객체가 아니면 ToObject 로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는
객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.1.2.10 : ECMAScript 2015에서는
Object.getOwnPropertyNames의 인자가 객체가 아니면 ToObject 로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는
객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.1.2.12 : ECMAScript 2015에서는
Object.getPrototypeOf의 인자가 객체가 아니면 ToObject 로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는
객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.1.2.16 : ECMAScript 2015에서는
Object.isExtensible의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상
TypeError 가 발생했습니다.
20.1.2.17 : ECMAScript 2015에서는
Object.isFrozen의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상
TypeError 가 발생했습니다.
20.1.2.18 : ECMAScript 2015에서는
Object.isSealed의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상
TypeError 가 발생했습니다.
20.1.2.19 :
ECMAScript 2015에서는 Object.keys의 인자가 객체가 아니면 ToObject 로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는
객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.1.2.20 : ECMAScript 2015에서는
Object.preventExtensions의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상
TypeError 가 발생했습니다.
20.1.2.22 :
ECMAScript 2015에서는 Object.seal의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체 처럼 취급됩니다. 이전
판에서는 객체가 아닌 인자에 대해 항상 TypeError 가 발생했습니다.
20.2.3.2 : ECMAScript 2015에서는 바인드 함수의 [[Prototype]] 내부 슬롯이 타겟 함수의 [[GetPrototypeOf]] 값으로
설정됩니다. 이전 판에서는 [[Prototype]] 이 항상 %Function.prototype% 로
설정되었습니다.
20.2.4.1 : ECMAScript 2015에서는 함수 인스턴스의
"length" 프로퍼티가 설정 가능(configurable)합니다. 이전 판에서는 설정 불가능(non-configurable)했습니다.
20.5.6.2 : ECMAScript
2015에서는 NativeError 생성자 의 [[Prototype]] 내부 슬롯이 Error
생성자 입니다. 이전 판에서는
Function prototype
object 였습니다.
21.4.4 ECMAScript 2015에서는
Date prototype object 가 Date
인스턴스가 아닙니다. 이전 판에서는 TimeValue가 NaN 인 Date 인스턴스였습니다.
22.1.3.12 ECMAScript 2015에서는
String.prototype.localeCompare 함수가 Unicode 표준에 따라 정규적으로 동등한 문자열을 동일하게 취급해야 합니다. 이전 판에서는
구현체가 정규 동등성을 무시하고 비트 단위 비교를 사용할 수 있었습니다.
22.1.3.28 및 22.1.3.30 ECMAScript 2015에서는 소문자/대문자 변환이
코드 포인트 단위로 처리됩니다. 이전 판에서는 개별 코드 유닛에만 변환을 적용했습니다. 실제로 영향을 받는 코드 포인트는 Unicode의 데저렛 블록에 속하는 것들입니다.
22.1.3.32 ECMAScript 2015에서는
String.prototype.trim 메서드가 Unicode BMP 밖에도 존재할 수 있는 공백 코드 포인트를 인식하도록 정의됩니다. 하지만 Unicode 7
기준으로 그런 코드 포인트는 정의되어 있지 않습니다. 이전 판에서는 그런 코드 포인트가 공백으로 인식되지 않았습니다.
22.2.4.1 ECMAScript 2015에서는 pattern
인자가 RegExp 인스턴스이고 flags 인자가 undefined 가 아닌 경우, pattern 과 거의 동일하지만
flags 인자로 플래그가 대체된 새로운 RegExp 인스턴스를 생성합니다. 이전 판에서는 pattern 이 RegExp 인스턴스이고
flags 가 undefined 가 아니면 TypeError 예외가 발생했습니다.
22.2.6 ECMAScript 2015에서는
RegExp prototype object 가
RegExp 인스턴스가 아닙니다. 이전 판에서는 패턴이 빈 문자열인 RegExp 인스턴스였습니다.
22.2.6 ECMAScript 2015에서는
"source" , "global" , "ignoreCase" ,
"multiline" 이 접근자 프로퍼티 로 RegExp prototype object 에
정의되어 있습니다. 이전 판에서는 RegExp 인스턴스에 데이터 프로퍼티로 정의되어 있었습니다.
25.4.15 :
ECMAScript 2019에서는 Atomics.wake가 Atomics.notify로 이름이 변경되어
Atomics.wait와 혼동을 방지합니다.
27.1.6.4 , 27.6.3.6 : ECMAScript 2019에서는 await에
의해 대기열에 추가되는 잡(Jobs) 의 수가 줄어들어,
then() 호출과 await 표현식 사이에 해결 순서의 차이가 관찰될 수 있습니다.
참고문헌
IEEE 754-2019 : IEEE 부동소수점 산술 표준 .
전기전자기술자협회, 뉴욕 (2019)
참고
ECMA-262 명세에 영향을 주는 IEEE 754-2008과 IEEE 754-2019 사이에는 규범적 변경사항이 없습니다.
유니코드 표준 , <https://unicode.org/versions/latest >에서 확인 가능
Unicode 기술노트 #5: 애플리케이션에서의 정규 동등성 , <https://unicode.org/notes/tn5/ >에서 확인 가능
Unicode 기술 표준 #10: Unicode Collation Algorithm , <https://unicode.org/reports/tr10/ >에서 확인 가능
Unicode 표준 부록 #15, Unicode 정규화 형식 , <https://unicode.org/reports/tr15/ >에서 확인 가능
Unicode 표준 부록 #18: Unicode 정규표현식 , <https://unicode.org/reports/tr18/ >에서 확인 가능
Unicode 표준 부록 #24: Unicode Script 속성 , <https://unicode.org/reports/tr24/ >에서 확인 가능
Unicode 표준 부록 #31, Unicode 식별자 및 패턴 문법 , <https://unicode.org/reports/tr31/ >에서 확인 가능
Unicode 표준 부록 #44: Unicode 문자 데이터베이스 , <https://unicode.org/reports/tr44/ >에서 확인 가능
Unicode 기술 표준 #51: Unicode 이모지 , <https://unicode.org/reports/tr51/ >에서 확인 가능
IANA 시간대 데이터베이스 , <https://www.iana.org/time-zones >에서 확인 가능
ISO 8601:2004(E) 데이터 요소 및 교환 형식 — 정보 교환 — 날짜와 시간의 표현
RFC 1738 “Uniform Resource Locators (URL)” , <https://tools.ietf.org/html/rfc1738 >에서 확인 가능
RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax” , <https://tools.ietf.org/html/rfc2396 >에서 확인 가능
RFC 3629 “UTF-8, a transformation format of ISO 10646” , <https://tools.ietf.org/html/rfc3629 >에서 확인 가능
RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content” , <https://tools.ietf.org/html/rfc7231 >에서 확인 가능
콜로폰
이 명세는 GitHub 에서 Ecmarkup 이라는 일반 텍스트 소스 형식으로 작성됩니다. Ecmarkup은
ECMAScript 명세를 일반 텍스트로 작성하고, 편집 규칙을 따르는 HTML 렌더링으로 처리할 수 있는 프레임워크 및 도구집을 제공하는 HTML과 Markdown의 변형입니다.
Ecmarkup은 Grammarkdown 을 이용한 구문 정의, Ecmarkdown 을 이용한 알고리즘 단계 작성 등 여러 형식과 기술을 통합합니다. 이
명세의 PDF 렌더링은 CSS 페이지 미디어 명세를 활용한 인쇄용 스타일시트를 사용하여 PrinceXML 로 변환해
생성됩니다.
이전 판의 명세는 Word로 작성되었습니다. 이 판의 기반이 된 Ecmarkup 소스 텍스트는 ECMAScript 2015 Word 문서를 자동 변환 도구로 Ecmarkup으로 변환하여
만들었습니다.
Copyright & Software License
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
Copyright Notice
© 2025 Ecma International
This draft document may be copied and furnished to others, and derivative works that comment on or
otherwise explain it or assist in its implementation may be prepared, copied, published, and
distributed, in whole or in part, without restriction of any kind, provided that the above copyright
notice and this section are included on all such copies and derivative works. However, this document
itself may not be modified in any way, including by removing the copyright notice or references to
Ecma International, except as needed for the purpose of developing any document or deliverable
produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on
the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma
International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA
INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Software License
All Software contained in this document ("Software") is protected by copyright and is being made
available under the "BSD License", included below. This Software may be subject to third party rights
(rights from parties other than Ecma International), including patent rights, and no licenses under such
third party rights are granted under this license even if the third party concerned is a member of Ecma
International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm
FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA
INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.